由于 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<String, String[]> parameterMap; // 所有参数的Map集合 public ChangeRequestWrapper(HttpServletRequest request) {
super(request);
parameterMap = request.getParameterMap();
} /**
* 获取所有参数名
*
* @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;
} }

接着重写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<String, String[]> 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<String, Object> 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 新增拦截器配置,直接复制进去就可以了。

  <filter>
<filter-name>languageFilter</filter-name>
<filter-class>com.ccs.ssmis.common.interceptors.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>/*</url-pattern>
</filter-mapping>

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

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

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

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

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

关于 preHandle 重写和添加参数问题,重写HttpServletRequestWrapper和Filter的更多相关文章

  1. Android Studio 重写方法时参数命名异常

    Android Studio 重写方法时参数命名异常 Android Studio 重写方法时参数名称乱掉可以通过下载相应源码解决

  2. java 重写你可以这么理解 因为 方法名和参数类型个数相同 所以这就是重写了 然后 因为是重写 所以 返回值必须相同

    java  重写你可以这么理解    因为   方法名和参数类型个数相同  所以这就是重写了    然后  因为是重写  所以  返回值必须相同

  3. 为什么重写equals的同时要重写hashcode

    在覆盖equals方法的时候,你必须要遵守它的通用约定.下面是约定的内容,来自Object的规范[JavaSE6] 自反性.对于任何非null的引用值x,x.equals(x)必须返回true. 对称 ...

  4. RDLC中添加参数,用来显示报表中数据集之外的信息。

    我添加了两个参数,首先后台: ReportParameter rp = ,,).ToString()); ReportParameter rp1 = new ReportParameter(" ...

  5. c#数据绑定(4)——向查询中添加参数

    本实例主要练习了ADO.Net 连接到外部数据库的基础上,向查询中添加参数.使用的是ACCESS数据库. 在ACCESS数据库中可以用MSSQL的形式定义操作字符串,也可以采用OLEDB的形式. MS ...

  6. 在VS中向命令行添加参数的方法

    在VS中向命令行添加参数的方法 在VS中向命令行添加参数,即向main()函数传递参数的方法: 右键单击要 添加参数的工程-->属性-->配置属性-->调试,在右侧“命令参数”栏输入 ...

  7. 重写Equals为什么要同时重写GetHashCode

    .NET程序员都知道,如果我们重写一个类的Equals方法而没有重写GetHashCode,则VS会提示警告 :“***”重写 Object.Equals(object o)但不重写 Object.G ...

  8. 技巧~向URL地址添加参数

    只是个小技巧,感觉挺有用,拿出来分享一下 功能:在URL地址上添加参数,如果只有一个,会是?userid=1,需要是大于1个,会是&userid=1 实现: private string Ad ...

  9. Extjs中给同一个GridPanel中的事件添加参数的方法

    Extjs中给同一个GridPanel中的事件添加参数的方法: this.isUse = new Ext.Action({            text:'启用',            scope ...

随机推荐

  1. JavaScript 一个进行枚举选择的jquery插件(仿easyui风格)

    某次做项目要实现一个功能: 按星期选择一个连续的时间范围 比如:周一到周五,周六到周日 或 周六到周三 聪明的朋友马上想出办法:用两个选项为周一到周日的下拉列表实现,对 那样可以,但是我觉得不够友好, ...

  2. UVA 10534最长上升子序列运用

    在给定序列中寻找一个1~n+1递增,n~2n+1递减的序列,我的想法是直接对原序列和原序列的反序列用nlgn算法求递增序列,例如序列a[]={1,2,4,1,2,6},它的反序列为b[]={6,2,1 ...

  3. nyoj161 取石子 (四) 威佐夫博弈

    思路:详细证明见博弈总结 如何判断威佐夫博弈的奇异局势? 对于状态(a, b),c = b - a,如果是奇异局势必定满足 a == c * (1+√5)/ 2. AC代码 #include < ...

  4. HDU - 2102 A计划 (BFS) [kuangbin带你飞]专题二

    思路:接BFS判断能否在限制时间内到达公主的位置,注意如果骑士进入传送机就会被立即传送到另一层,不会能再向四周移动了,例如第一层的位置(x, y, 1)是传送机,第二层(x, y, 2)也是传送机,这 ...

  5. 两种实现方式mycat多租户,枚举分片,注解拦截

    第一种: 优点:支持进一步分片 缺点:schema配置繁琐 注解式  /*!mycat:schema=[schemaName] */   注意:这在navicat 里面是会报错的,请用命令行登陆myc ...

  6. SIFT解析(三)生成特征描述子

    以上两篇文章中检测在DOG空间中稳定的特征点,lowe已经提到这些特征点是比Harris角点等特征还要稳定的特征.下一步骤我们要考虑的就是如何去很好地描述这些DOG特征点. 下面好好说说如何来描述这些 ...

  7. SpringBoot实战 之 异常处理篇

    在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然 ...

  8. ReportView动态加载带参数的RDCL文件及子报表

    本文来自Torres.Wu发表在博客园的博客,转载请标明出处. 同上一篇差不多,这次咱们加载带有子报表的RDCl文件.首先还是创建一个form程序,在form2窗体中添加一个ReporView控件,l ...

  9. 实战DeviceIoControl 之四:获取硬盘的详细信息

    Q 用IOCTL_DISK_GET_DRIVE_GEOMETRY或IOCTL_STORAGE_GET_MEDIA_TYPES_EX只能得到很少的磁盘参数,我想获得包括硬盘序列号在内的更加详细的信息,有 ...

  10. AlarmManager(全局定时器/闹钟)详解

    AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟.指定时长或以周期形式执行某项操作.通过对它的使用,个人觉得叫全局定时器比较合适,其实它的作用和Timer有点相似.都有两种相似的 ...