博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb 用拦截器实现编码设置&拦截器执行流程
阅读量:6083 次
发布时间:2019-06-20

本文共 5591 字,大约阅读时间需要 18 分钟。

hot3.png

使用Filter 设置编码简化Servlet的开发

1. 核心代码

package com.mscncn.jsd1404;import java.io.IOException;import java.io.UnsupportedEncodingException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import javax.servlet.http.HttpServletResponse;public class EncodingFilter implements Filter {		private static String encoding;	private static final String DEFAULT_CHARSET="UTF-8";	@Override	public void destroy() {		System.out.println("--------destroy---------");	}	@Override	public void doFilter(ServletRequest request, ServletResponse response,			FilterChain chain) throws IOException, ServletException {		System.out.println("--------doFilter---------");		HttpServletRequest httpRequest = (HttpServletRequest) request;  		HttpServletResponse httpResponse=(HttpServletResponse)response;		if("GET".equals(httpRequest.getMethod())){			EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httpRequest, encoding);               chain.doFilter(wrapper, response);  		}else{			httpRequest.setCharacterEncoding(encoding);			httpResponse.setContentType("text/html;charset="+encoding);			chain.doFilter(request, response);  		}	}	private static class  EncodingHttpServletRequest extends HttpServletRequestWrapper{		 private HttpServletRequest request;		 public EncodingHttpServletRequest(HttpServletRequest request,String encoding) {		   super(request);		   this.request = request;		 }		 @Override		public String getParameter(String name) {			   String value = request.getParameter(name);			   try {			    value = new String(value.getBytes("iso8859-1"), encoding);			   } catch (UnsupportedEncodingException e) {			    e.printStackTrace();			   }			   return super.getParameter(name);		}	}	@Override	public void init(FilterConfig config) throws ServletException {		 System.out.println("--------init---------");  		 encoding = config.getInitParameter("encoding");		 if(encoding==null||"".equals(encoding))			 encoding=DEFAULT_CHARSET;	}}

 2. web.xml 中得配置

  
  
characterFilter
  
com.mscncn.jsd1404.EncodingFilter
  
  
encoding
  
UTF-8
  
  
  
  
characterFilter
  
  
/*
  

3. filter 的执行流程

172904_jCvR_1775885.png

测试代码如下:

    servlet

public class MyFilterTestServlet extends HttpServlet {	private static final long serialVersionUID = 1L;	@Override	protected void service(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		System.out.println(" 执行servlet 中的 service()方法 \t\t\t\t\t"+" 33333333");	}}

第一个拦截器:

package com.mscncn.jsd1404;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class ServletFilter1 implements Filter {	@Override	public void destroy() {			}	@Override	public void doFilter(ServletRequest request, ServletResponse response,			FilterChain chain) throws IOException, ServletException {		System.out.println("第一个拦截器的chain.doFilter()之前 \t\t\t\t\t"+" 111111111");		chain.doFilter(request, response);		System.out.println("第一个拦截器的chain.doFilter()之后 \t\t\t\t\t"+" 5555555");	}	@Override	public void init(FilterConfig arg0) throws ServletException {	}}

第二个拦截器:

package com.mscncn.jsd1404;import java.io.IOException;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;public class ServletFilter2 implements Filter {	@Override	public void destroy() {			}	@Override	public void doFilter(ServletRequest request, ServletResponse response,			FilterChain chain) throws IOException, ServletException {		System.out.println("第二个拦截器的chain.doFilter()之前 \t\t\t\t\t"+" 2222222");		chain.doFilter(request, response);		System.out.println("第二个拦截器的chain.doFilter()之后 \t\t\t\t\t"+" 4444444");	}	@Override	public void init(FilterConfig arg0) throws ServletException {	}}

web.xml中的配置:

  
1D
  
    
index.html
    
index.htm
    
index.jsp
    
default.html
    
default.htm
    
default.jsp
  
    
  
  
characterFilter
  
com.mscncn.jsd1404.EncodingFilter
  
  
encoding
  
UTF-8
  
  
    
  
filter1
  
com.mscncn.jsd1404.ServletFilter1
  
  
  
filter2
  
com.mscncn.jsd1404.ServletFilter2
  
    
  
characterFilter
  
  
/*
  
  
  
filter1
  
  
/test
  
    
  
filter2
  
  
/test
  
  
  
test
  
com.mscncn.jsd1404.MyFilterTestServlet
  
  
  
test
  
/test
  

执行结果:

175225_N8gO_1775885.png

175227_mehg_1775885.png

转载于:https://my.oschina.net/KingPan/blog/293268

你可能感兴趣的文章
内存模型
查看>>
如何快速开发网站?
查看>>
tomcat等服务器返回给页面的数字分别表示的意思!
查看>>
我的友情链接
查看>>
个人博客
查看>>
我的友情链接
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
Windows Server 2012 远程桌面,你需要具有通过远程桌面服务进行登录的权限
查看>>
Linux流量监控工具 – iftop
查看>>
【VMCloud云平台】SCCM(八)OSD(四)
查看>>
JavaTM Virtual Machine Profiler Interface (JVMPI)
查看>>
使用IKAnalyzer分词计算文章关键字并分享几个分词词典
查看>>
分布式进程管理
查看>>
Python下用List对员工信息表进行模糊匹配
查看>>
Mysql 主从复制
查看>>
【SQL Server备份恢复】数据库还原
查看>>
Angular js http请求发送和jquery的ajax一样的数据设置方式
查看>>
Andrid在一个程序中启动另一个程序
查看>>
mysql++ (Tserver安装问题)
查看>>
李开复给大支招 大学生创业有五忌
查看>>