进行编码处理:
获取请求参数中的乱码问题;
- POST请求:request.setCharacterEncoding(“utf-8”);
- GET请求:new String(request.getParameter(“xxx”).getBytes(“iso-8859-1”), “utf-8”);
响应的乱码问题:response.setContextType(“text/html;charset=utf-8”)。
基本上在每个Servlet中都要处理乱码问题,所以应该把这个工作放到过滤器中来完成。
可以使用 装饰者模式(Decorator Pattern)进行增强getParameter(String name)方法来实现
装饰者模式的实现原理,
1)增强类和被增强的类要实现统一接口。
2)在增强类中传入被增强类,
3)需要增强的方法重写,不需要增强的方法调用被增强的对象。
创建一个装饰者类:
public class MyRequest extends HttpServletRequestWrapper { //实现有参构造方法 public MyRequest(HttpServletRequest request) { super(request); } @Override public String getParameter(String name) { //进行请求编码处理 HttpServletRequest request = (HttpServletRequest) getRequest(); //用户请求方式 if ("GET".equals(request.getMethod())) { //获取调用getParameter(name)的值 String value = request.getParameter(name); try { //判断非空,防止没有值报空指针异常 if (value != null) { //返回转码后的value的值 return new String(value.getBytes("ISO-8859-1"), "UTF-8"); } //没有值返回空 return null; } catch (UnsupportedEncodingException e) { //手抛出运行时异常,打印错误日志 throw new RuntimeException(e); } } else { try { //post提交的转码方法 request.setCharacterEncoding("UTF-8"); return request.getParameter(name); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } } //多个值的编码处理 @Override public String[] getParameterValues(String name) { HttpServletRequest request = (HttpServletRequest) getRequest(); if ("GET".equals(request.getMethod())) { // 将获取的值放去数组中 String[] values = getRequest().getParameterValues(name); for (int i = 0; i < values.length; i++) { try { //将当中的值一个个分别进行编码处理 values[i] = new String(values[i].getBytes("ISO-8859-1"), "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } //返回编码后的数据 return values; } else { try { request.setCharacterEncoding("UTF-8"); return request.getParameterValues(name); } catch (UnsupportedEncodingException e) { throw new RuntimeException(e); } } }
装饰者模式应该是实现相同的接口,但是 底层提供了HttpServletRequestWrapper 实现了HttpServletRequest接口
里面实现了HttpServletRequest接口,但是没有增强,因此我们可以继承这个类,对需要增强的方法进行重写
创建一个全局过滤器,
重写request请求,实现请求编码的处理
@WebFilter(dispatcherTypes = { DispatcherType.REQUEST, DispatcherType.FORWARD } , urlPatterns = { "/*" }) public class EncodingFilter implements Filter { public void destroy() {} public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //响应编码处理 response.setContentType("text/html;charset=UTF-8"); //把request 变成 MyRequest对象 //获取增强之后的request,增强了getParaement() MyRequest req = new MyRequest((HttpServletRequest)request); //放行 chain.doFilter(req, response); } public void init(FilterConfig fConfig) throws ServletException {} }