博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
preHandle 添加参数和重写参数的问题,重写HttpServletRequestWrapper和Filter
阅读量:7030 次
发布时间:2019-06-28

本文共 4311 字,大约阅读时间需要 14 分钟。

由于 preHandle 中HttpServletRequest 只有setAttribute而没有setParameter 也没有 add 方法

所以是没办法直接添加参数的。从网上查了很多资料,基本都是说要重写HttpServletRequestWrapper

说干就干,通过网上查博客看看别人的实现方式,可能因为自己底子不够扎实吧,很多都看不懂,摸索了

一天总算是弄出来了。现在记录一下,方便以后查阅。

 

首先,创建一个ChangeRequestWrapper 类继承HttpServletRequestWrapper,代码如下

package com.ccs.ssmis.common.interceptors;import com.ccs.ssmis.common.redis.RedisUtils;import com.ccs.ssmis.common.utils.Constants;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;import java.util.*;public class ChangeRequestWrapper extends HttpServletRequestWrapper {    private Map
parameterMap; // 所有参数的Map集合 public ChangeRequestWrapper(HttpServletRequest request) { super(request); parameterMap = request.getParameterMap(); } /** * 获取所有参数名 * * @return 返回所有参数名 */ @Override public Enumeration
getParameterNames() { Vector
vector = new Vector
(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
getParameterMap() { return parameterMap; }   public void setParameterMap(Map
parameterMap) { this.parameterMap = parameterMap; }}

接着重写Filter。代码如下

package com.ccs.ssmis.common.interceptors;import com.ccs.ssmis.common.redis.RedisUtils;import com.ccs.ssmis.common.utils.Constants;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;import java.util.HashMap;import java.util.Map;public class LangFilter implements Filter {    private Logger logger = LoggerFactory.getLogger(this.getClass());    @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
parameterMap = new HashMap<>(changeRequestWrapper.getParameterMap()); String[] strings = parameterMap.get("token"); //逻辑代码 判断有没有传入token,如果没有,则直接通过 if (strings == null || strings.length == 0) { changeRequestWrapper.setParameterMap(parameterMap); }else{ logger.info("=============拦截器解析token=================="); parameterMap.put("token", strings); //解析token Map
map = RedisUtils.getMap(strings[0] + Constants.token_Suffix); parameterMap.put("isok", "false".split(",")); if (map!=null) { parameterMap.put("userId", map.get("userId").toString().split(",")); parameterMap.put("isok", "true".split(",")); } changeRequestWrapper.setParameterMap(parameterMap); } //复写 HttpServletRequestWrapper filterChain.doFilter(changeRequestWrapper, servletResponse); } @Override public void destroy() { }}

接着 在web.xml 新增拦截器配置,直接复制进去就可以了。

languageFilter
com.ccs.ssmis.common.interceptors.LangFilter
encoding
UTF-8
forceEncoding
true
languageFilter
/*

注意:配置的拦截器会在preHandle方法之前执行。所以逻辑代码可以直接写在Filter的重写类里面

希望大家共同学习共同进步。谢谢。

本博客是借鉴别人的博客改写的,转载请注明来处谢谢。

参考地址:https://www.cnblogs.com/cach/p/8052108.html

链接地址:http://www.cnblogs.com/richard-ju/p/L2018003.html

转载于:https://www.cnblogs.com/richard-ju/p/L2018003.html

你可能感兴趣的文章
掘金翻译计划月报 — 2018 年 2 月
查看>>
Android属性动画
查看>>
渐进式Express源码学习5-全副武装
查看>>
JVM难学?那是因为你没认真看完这篇文章
查看>>
python面试题(五)
查看>>
老司机 iOS 周报 #40 | 2018-10-22
查看>>
VirtualView iOS 模板加载功能实现详解
查看>>
这可能是最好的性能优化教程(二)
查看>>
被马化腾点赞的微信车票设计,背后有哪些故事?
查看>>
Spring理论基础-面向切面编程
查看>>
BloomFilter 原理,实现及优化
查看>>
PHP本地文件包含漏洞环境搭建与利用
查看>>
OGNL设计及使用不当造成的远程代码执行漏洞
查看>>
Vue-cli + express 构建的SPA Blog(采用前后端分离方案)
查看>>
ios中的多播委托
查看>>
Java基础-单例模式
查看>>
轻仿QQ音乐之音频歌词播放、锁屏歌词
查看>>
MongoDB 4.0 RC 版本强势登陆
查看>>
AliOS Things网络适配框架 - SAL
查看>>
iOS 客户端与服务端做时间同步
查看>>