描述:乱码问题一直存在,我们可以在servlet中进行解决,但是如果servlet很多,这样处理起来就会很麻 烦,所以可以在全局设置码表问题,这样就用到了filter拦截所以请求与响应,设置字符集。
//拦截器继承了自己写的拦截器父类
public class CharacterFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 解决response中文乱码
response.setContentType("text/html;charset=utf-8");
// 解决request中文乱码,但是只对post有效,get还需手动转换
request.setCharacterEncoding("utf-8");
// 应用已经包装的类,将包装后的request放到放行的代码中
MyRequest myrequest = new MyRequest(request);
// 放行
chain.doFilter(myrequest, response);
}
}
//对 request 进行包装
//HttpServletRequestWrapper类是sun公司帮我们包装好的一个类,这个类继承了ServletRequestWrapper实现了HttpServletRequest
//因为HttpServletRequest这个类的方法很多,所以我们用到包装设计模式要将所有的方法都原封不动的调用父类的方法,很麻烦所以sun公司实现了
//我们就单独继承HttpServletRequestWrapper这个类就行了,覆盖我们想增强的代码就行了。
class MyRequest extends HttpServletRequestWrapper {
public MyRequest(HttpServletRequest request) {
super(request);
}
// 重写父类的方法 需要加强的方法
@Override
public String getParameter(String name) {
// 解决 get 方式下请求参数的乱码问题
// 调用被包装对象的 getParameter方法来获得参数
String value = super.getParameter(name);
// 判断非空
if(value==null)
return null;
// 获得请求的方式
String method = super.getMethod();
if("get".equalsIgnoreCase(method)) {
try {
//此处写死了代码,其实转成什么码表应该配置在web.xml文件中的初始化参数。
value = new String(value.getBytes("iso-8859-1"), "utf-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException(e);
}
}
return value;
}
}