专栏首页强仔仔使用HttpServletRequestWrapper重写Request请求参数

使用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>

所有.do的请求,都会验证此参数

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MyBatis3-实现MyBatis分页

    此文章中的例子是沿用上一篇文章http://www.cnblogs.com/EasonJim/p/7055499.html的Spring MVC集成的例子改装的...

    林老师带你学编程
  • MongodbGFS存储大文件(java版)

    Mongodb 是一个开源的no-sql分布式数据库,Mongodb也为我们提供了基于文件的GFS分布式存储系统。因此利用Mongodb我们完全可以实现一个分...

    林老师带你学编程
  • 【面试题】SpringCloud架构中如何保证定时任务只在一个服务在执行

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/...

    林老师带你学编程
  • Java开发中的23种设计模式详解(转)

                                      ——可复用面向对象软件的基础

    肖哥哥
  • Java开发中的23种设计模式详解

    结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

    用户5640963
  • 建造者模式多产品情况反射实现

    前面在《重温设计模式之建造者模式(Builder)》中关于建造者模式的的介绍比较简单,代码只是实现了基本的模式,因为实际应用中不可能只考虑一个模式的,因此这里给...

    the5fire
  • 第十二天 面向对象-构造方法继承this super【悟空教程】

    Java帮帮
  • 一篇文章带你了解this关键字和单例模式

    前面的文章给大家介绍了Java诸多基础知识,感兴趣的小伙伴记得前往噢:Java基础入门篇——for循环、Java基础入门篇——While循环、Java基...

    用户8211341
  • HeadFirst设计模式

    抽象父类只负责实现相应功能不用管具体是哪一个实现。 子类想调用哪一个行为,就new一个新的行为。

    黑白格
  • JAVA——类的定义及其实例化

    mathor

扫码关注云+社区

领取腾讯云代金券