zoukankan      html  css  js  c++  java
  • 使用HttpServletRequestWrapper重写Request请求参数

    目的: 改变请求参数的值,满足项目需求(如:过滤请求中 lang != zh 的请求)

    1.使用 HttpServletRequestWrapper重写

    public class ChangeRequestWrapper extends HttpServletRequestWrapper {
        private Map<String, String[]> parameterMap; // 所有参数的Map集合
    
        public ChangeRequestWrapper(HttpServletRequest request) {
            super(request);
            parameterMap = request.getParameterMap();
        }
    
        // 重写几个HttpServletRequestWrapper中的方法
    
        /**
         * 获取所有参数名
         *
         * @return 返回所有参数名
         */
        @Override
        public Enumeration<String> getParameterNames() {
            Vector<String> vector = new Vector<String>(parameterMap.keySet());
            return vector.elements();
        }
    
        /**
         * 获取指定参数名的值,如果有重复的参数名,则返回第一个的值 接收一般变量 ,如text类型
         *
         * @param name 指定参数名
         * @return 指定参数名的值
         */
        @Override
        public String getParameter(String name) {
            String[] results = parameterMap.get(name);
            return results[0];
        }
    
    
        /**
         * 获取指定参数名的所有值的数组,如:checkbox的所有数据
         * 接收数组变量 ,如checkobx类型
         */
        @Override
        public String[] getParameterValues(String name) {
            return parameterMap.get(name);
        }
    
        @Override
        public Map<String, String[]> getParameterMap() {
            return parameterMap;
        }
    
        public void setParameterMap(Map<String, String[]> parameterMap) {
            this.parameterMap = parameterMap;
        }
    }

    2.新增Filter

    public class LangFilter implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            ChangeRequestWrapper changeRequestWrapper = new ChangeRequestWrapper((HttpServletRequest) servletRequest);
    
            Map<String, String[]> parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap());
    
            String[] strings = parameterMap.get("lang");           //逻辑代码给定默认的参数值,如果参数不为中文,则直接返回异常
            if (strings == null || strings.length == 0) {
                strings = new String[1];
                strings[0] = "zh";
                parameterMap.put("lang", strings);
                changeRequestWrapper.setParameterMap(parameterMap);
            }else{
                String language = strings[0];
                if (!language.equals("zh")) {
                    Map<String,String> error = new HashMap<>();
                    error.put("code","500");
    
                    ServletOutputStream outputStream = null;
                    try {
                        outputStream = servletResponse.getOutputStream();
                        outputStream.write(JSONUtils.obj2Byte(error));
                    } finally {
                        if (outputStream != null) {
                            outputStream.flush();
                            outputStream.close();
                        }
                    }
    
                    return;
                }
            }
            //使用复写后的wrapper
            filterChain.doFilter(changeRequestWrapper, servletResponse);
        }
    
        @Override
        public void destroy() {
    
        }
    }

     3.web.xml增加一个过滤器处理

    <filter>
            <filter-name>languageFilter</filter-name>
            <filter-class>com.intercepor.LangFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
            <init-param>
                <param-name>forceEncoding</param-name>
                <param-value>true</param-value>
            </init-param>
        </filter>
    
        <filter-mapping>
            <filter-name>languageFilter</filter-name>
            <url-pattern>*.do</url-pattern>
        </filter-mapping>
  • 相关阅读:
    类型构造器
    WIN32画图窗口
    WIN32创建进程CreateProcess
    WIN通过消息实现互斥同步CreateEvent和SetEvent
    WIN32生产消费经典同步但是以消耗时间为代价
    WIN32互斥体CreateMutex以及限制多开
    WIN32临界区线程锁EnterCriticalSection和LeaveCriticalSection
    GetThreadContext和SetThreadContext
    远程线程注入
    EnumProcessModules 使用 获取进程的路径
  • 原文地址:https://www.cnblogs.com/niunafei/p/13791814.html
Copyright © 2011-2022 走看看