全局编码过滤

分析过程:

解决:

1、使用装饰模式   增强request的功能

     装饰:1、装饰类和被装饰类要实现同一接口或者继承同意对象

              2、被装饰类对象的引用传递给装饰类的构造方法

              3、重写方法,进行功能增强

      如果已经有装饰的类或者接口,直接实现或继承即可

      代码实现:

              1、class Myrequest extends HttpServletRequestWrapper{

                        private HttpServletRequest request;

                        public Myrequest(){

                                  super(request);

                  this.request=request;                     

                                   }

                        }

                  注意:HttpServletRequestWrapper没有无参构造方法,子类需要指定构造方法。

                2、要重写关于请求参数获取的方法。

                     String getParameter(String name);

                     String[] getParameterValues(String name);

                     Map<String,String[]> getPatameterMap();

                     通过分析,发现getParameter(String name)、getParameter(String name)方法可以依赖于getPatameterMap()方法实现,也就是说,我们重点需要重写getPatameterMap()方法就可以了,其他两个调用getPatameterMap();

                      代码如下:

                             

public class MyRequest extends HttpServletRequestWrapper {
private HttpServletRequest request;
public MyRequest(HttpServletRequest request) {
super(request);
this.request=request;
}

@Override
public String getParameter(String name) {
Map<String,String[]> map=getParameterMap();
if(name==null){
return null;
}
String[] values=map.get(name);
if(values==null|| values.length==0){
return null;
}
return values[0];
}

@Override
public String getParameterNames(String name) {
Map<String,String[]> map=getParameterMap();
if(name==null){
return null;
}
String[] values=map.get(name);
return values;
}
private boolean flag=true;
@Override
public Map getParameteString {
//获取所有的map集合
Map<String,String[]> map=request.getParameterMap();
//遍历map集合 解决编码问题
if(flag){for(String key:map.keySet()){
String[] values=map.get(key);
//将获取的值的编码改变成utf-8
for(int i=0;i<values.length;i++){
try{values[i]=new String(values[i].getBytes("iso8859-1"),"utf-8");
}catch(UnsupportedEncodingException e){
e.printStackTrace();
}
}
}
flag=false;
}
return map;
}

   

2、Filter中写的内容:

package cn.ahnu.a;

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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FilterDemo implements Filter {

public void destroy() {

}

public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {

HttpServletRequest reqeust=(HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
//使用自己寫的裝飾類增強request的功能
MyRequest request=new MyRequest(request);
//這裡所使用的就是裝飾的request對象
arg2.doFilter(reqeust, response);

}

public void init(FilterConfig arg0) throws ServletException {

}

}

3、配置的web.xml

<filter>
<filter-name>FilterDemo</filter-name>
<filter-class>cn.ahnu.a.FilterDemo</filter-class>
</filter>

<filter-mapping>
<filter-name>FilterDemo</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

再运行即可解决get、post的中文乱码问题

原文地址:https://www.cnblogs.com/leiandjing/p/5780516.html