过滤器解决Tomcat7以前的请求乱码问题
在我们运行tomcat7以前的版本的时候,会出现中文乱码的问题,在每一次请求里面去解决很麻烦,我们就利用过滤器过滤每一个页面的这个特性去解决这个中文乱码问题。
下面是我们过滤器的一个代码
1 package com.gyf.tieba.web.filter; 2 3 import java.io.IOException; 4 import java.io.UnsupportedEncodingException; 5 import java.util.Map; 6 import java.util.Map.Entry; 7 8 import javax.servlet.Filter; 9 import javax.servlet.FilterChain; 10 import javax.servlet.FilterConfig; 11 import javax.servlet.ServletException; 12 import javax.servlet.ServletRequest; 13 import javax.servlet.ServletResponse; 14 import javax.servlet.annotation.WebFilter; 15 import javax.servlet.http.HttpServletRequest; 16 import javax.servlet.http.HttpServletRequestWrapper; 17 18 19 public class MyEncodingFilter implements Filter{ 20 21 @Override 22 public void init(FilterConfig filterConfig) throws ServletException {} 23 @Override 24 public void destroy() {} 25 26 @Override 27 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 28 throws IOException, ServletException { 29 //1.设置POST请求中文乱码的问题,现在使用struts,post请求中文乱码问题就不须要设置 30 request.setCharacterEncoding("UTF-8"); 31 System.out.println("拦截请求:" + request); 32 33 //2.解决get请求的中文乱码问题 34 HttpServletRequest hsr = (HttpServletRequest)request; 35 //判断一下这个请求是否是get请求,如果是则调用我们的内部内方法 36 if(hsr.getMethod().equalsIgnoreCase("get")){ 37 MyRequest myRequest = new MyRequest(hsr); 38 //放行请求 39 chain.doFilter(myRequest, response); 40 }else{ 41 chain.doFilter(request, response); 42 } 43 44 45 } 46 47 } 48 /** 49 * Wrapper包装类,装饰设计模式,内部有个真实对象的引用 50 * 51 */ 52 class MyRequest extends HttpServletRequestWrapper{ 53 54 private HttpServletRequest request; 55 56 private boolean isEncoding = false;//是否已经utf-8编码 57 58 public MyRequest(HttpServletRequest request) { 59 super(request); 60 this.request = request; 61 } 62 63 @Override 64 //重写父类的方法 65 public String getParameter(String name) { 66 return getParameterMap().get(name)[0]; 67 } 68 69 @Override 70 //获取参数的方法 71 public Map<String, String[]> getParameterMap() { 72 //获取客户端传过来的参数数据,并且包装成一个Map集合 73 Map<String, String[]> map = request.getParameterMap(); 74 75 if(isEncoding == true){ 76 return map; 77 } 78 79 //遍历vlaue,改成utf-8编码 80 for(Entry<String, String[]> entry : map.entrySet()){ 81 //取数组值 82 String[] values = entry.getValue(); 83 for(int i=0;i<values.length;i++){ 84 try { 85 //把每一个字符串都改成Utf-8编码 86 values[i] = new String(values[i].getBytes("ISO-8859-1"),"UTF-8"); 87 } catch (UnsupportedEncodingException e) { 88 // TODO Auto-generated catch block 89 e.printStackTrace(); 90 } 91 } 92 } 93 isEncoding = true; 94 95 return map; 96 } 97 }
使用的方式只需要在web.xml文件里面配置好过滤器就好了
下面我们看看web.xml里面的代码,如果你是在框架里面加过滤器的话,就需要把这个我们自己写的编码过滤器的映射放在框架过滤器的映射前面,这里我们以struts2框架为例
1 <!-- 1.配置struts的拦截器/过滤器--> 2 <filter> 3 <filter-name>struts2</filter-name> 4 <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class> 5 </filter> 6 7 <!--2.配置tomcat7.0 get请求的乱码问题的编码过滤器--> 8 <filter> 9 <filter-name>myEncodingFilter</filter-name> 10 <filter-class>com.gyf.tieba.web.filter.MyEncodingFilter</filter-class> 11 </filter> 12 13 <filter-mapping> 14 <filter-name>myEncodingFilter</filter-name> 15 <url-pattern>/*</url-pattern> 16 </filter-mapping> 17 18 <filter-mapping> 19 <filter-name>struts2</filter-name> 20 <url-pattern>/*</url-pattern> 21 </filter-mapping>
注意,我们自己配置的编码过滤器的映射一定要放在框架的过滤器映射前面,这样才能够有效果
浙公网安备 33010602011771号