• 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 {}
    }
  • 相关阅读:
    FineReport自学习题第四题——图表
    SQL如何查询连续数字并且统计连续个数
    Arm Cortex-M3 MCU性能
    北汽蓝谷极狐阿尔法S与T
    长鑫存储DDR产品
    华虹宏力芯片制造主流工艺技术
    传统编译器与神经网络编译器
    Apple苹果公司组织架构
    GPU与CPU交互技术
    CMOS图像传感器与DDI显示芯片
  • 原文地址:https://www.cnblogs.com/64Byte/p/12925549.html
Copyright © 2020-2023  润新知