Jsp--编码处理过滤器Filter(装饰者设计模式)

进行编码处理:

 获取请求参数中的乱码问题;

  • 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 {}
}

猜你喜欢

转载自www.cnblogs.com/64Byte/p/12925549.html
今日推荐