全局编码过滤
分析过程:
解决:
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的中文乱码问题