目的 : 实现javaweb项目的全站编码问题
需要解决的问题 : 在何时进行编码问题的解决, 在何处进行编码问题的解决, 才用什么方法进行解决
设计思路 : 在Filter进行全站的编码转换, 对于GET请求 : 使用装饰者模式(是你有你一切拜托你), 修改Request.getParameter()方法, 在getparameter()方法进行编码的转换; 对于POST请求直接在FIilter进行过转换即可.
实际代码 :
1. Filter文件
packagecom.theangryz.filter;import javax.servlet.*;importjavax.servlet.http.HttpServletRequest;importjava.io.IOException;public class EncodingFilter implementsFilter {
@Overridepublic void init(FilterConfig filterConfig) throwsServletException {
}
@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throwsIOException, ServletException {
response.setContentType("text/html;charset=utf-8");
HttpServletRequest req=(HttpServletRequest) request;
req.setCharacterEncoding("utf-8");
EncodingRequest encodingRequest= newEncodingRequest(req);if (req.getMethod().equals("GET")){ //get请求
chain.doFilter(encodingRequest, response);
}else if (req.getMethod().equals("POST")){ //post请求
chain.doFilter(req, response);
}
}
@Overridepublic voiddestroy() {
}
}
2. EncodingRequest文件(对于GET请求的处理)
packagecom.theangryz.filter;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;public class EncodingRequest extends HttpServletRequestWrapper { //采用装饰者模式
privateHttpServletRequest request;publicEncodingRequest(HttpServletRequest httpServletRequest){super(httpServletRequest);this.request =httpServletRequest;
}
@OverridepublicString getParameter(String name) {try{
String str= new String(request.getParameter(name).getBytes("iso-8859-1"), "utf-8");returnstr;
}catch(Exception e){throw newRuntimeException(e);
}
}
}
实际编写中遇到的问题 :
1. 发现自己的GET请求已经通过UTF-8的方式进行编码了.
解决 : Tomcat默认配置(配置文件 : /安装目录/conf/server.xml)使用ISO-8859-1进行编码, 自己不知道何时修改过配置文件修改成了UTF-8配置了. 所以没有转换的必要了.
2. 重写getparameter()方法的时候, 参数理解错误了. getParameter(String name)入参name指的是请求中的参数名称, 需要使用 String str = request.getRequest(name);, 而不是直接name.getBytes("");
解决 : String str = request.getParameter(name); return new String(str.getBytes("iso--8859-1"), "utf-8");