javaWeb_全站编码
目的 : 实现javaweb项目的全站编码问题
需要解决的问题 : 在何时进行编码问题的解决, 在何处进行编码问题的解决, 才用什么方法进行解决
设计思路 : 在Filter进行全站的编码转换, 对于GET请求 : 使用装饰者模式(是你有你一切拜托你), 修改Request.getParameter()方法, 在getparameter()方法进行编码的转换; 对于POST请求直接在FIilter进行过转换即可.
实际代码 :
1. Filter文件
package com.theangryz.filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import java.io.IOException; public class EncodingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { response.setContentType("text/html;charset=utf-8"); HttpServletRequest req = (HttpServletRequest) request; req.setCharacterEncoding("utf-8"); EncodingRequest encodingRequest= new EncodingRequest(req); if (req.getMethod().equals("GET")){ //get请求 chain.doFilter(encodingRequest, response); }else if (req.getMethod().equals("POST")){ //post请求 chain.doFilter(req, response); } } @Override public void destroy() { } }
2. EncodingRequest文件(对于GET请求的处理)
package com.theangryz.filter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; public class EncodingRequest extends HttpServletRequestWrapper { //采用装饰者模式 private HttpServletRequest request; public EncodingRequest(HttpServletRequest httpServletRequest){ super(httpServletRequest); this.request = httpServletRequest; } @Override public String getParameter(String name) { try { String str = new String(request.getParameter(name).getBytes("iso-8859-1"), "utf-8"); return str; }catch(Exception e){ throw new RuntimeException(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");