zoukankan      html  css  js  c++  java
  • 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 {}
    }
  • 相关阅读:
    关于datax的SqlServerReader 插件文档读取设置
    SQLyog13.1.1连接MySQL 8.0.19时出现的2058错误,加密方式因版本支持问题解决方法。
    mysql客户端版本太低的问题,应该是先改变加密方式再修改密码.client does not support authentication protocol requested by server consider upgrading mysql client
    IntelliJ IDEA的JavaWeb开发环境搭建
    异构数据源同步工具DataX Web用户手册(一、安装)
    datax安装
    Sql Server 中 根据具体的值 查找该值所在的表和字段
    1202. 交换字符串中的元素
    路径总和
    买卖股票的最佳时机(II)
  • 原文地址:https://www.cnblogs.com/64Byte/p/12925549.html
Copyright © 2011-2022 走看看