本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除。
  但在后台程序中,一般对request的参数的操作,都是通过request的getParameter、getParameterNames、getParameterValues等方法执行的;所以我们要是能重写这些方法,就从侧面改变了request的请求参数。恰好,servlet就提供了一个HttpServletRequestWrapper类来供大家去继承(该类是HttpServletRequest的封装类),重写request相关方法。

这样可以修改比如shiro框架中的JSESSIONID,使单页H5中调用接口时只需要在头部添加在别处登录之后拿到的jsessionid的值,就能保证是登录状态。

具体服务端实现如下:

  1. package webapp.conf;
  2.  
  3. import org.apache.tomcat.util.http.MimeHeaders;
  4. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import org.springframework.web.filter.OncePerRequestFilter;
  8.  
  9. import javax.servlet.*;
  10. import javax.servlet.http.Cookie;
  11. import javax.servlet.http.HttpServletRequest;
  12. import javax.servlet.http.HttpServletRequestWrapper;
  13. import javax.servlet.http.HttpServletResponse;
  14. import java.io.IOException;
  15. import java.lang.reflect.Field;
  16. import java.util.*;
  17.  
  18. /**
  19. * 拦截器配置
  20. */
  21. @Configuration
  22. public class FilterConfig {
  23.  
  24. @Bean
  25. public FilterRegistrationBean modifyParametersFilter() {
  26. FilterRegistrationBean registration = new FilterRegistrationBean();
  27. registration.setFilter(new ModifyParametersFilter());
  28. registration.addUrlPatterns("/*"); // 拦截路径
  29. registration.setName("modifyParametersFilter"); // 拦截器名称
  30. registration.setOrder(1); // 顺序
  31. return registration;
  32. }
  33.  
  34. /**
  35. * 自定义拦截器
  36. */
  37. class ModifyParametersFilter extends OncePerRequestFilter {
  38. @Override
  39. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
  40. // 修改请求头
  41. Map<String, String> map = new HashMap<>();
  42. modifyHeaders(map, request);
  43.  
  44. // 修改cookie
  45. ModifyHttpServletRequestWrapper requestWrapper = new ModifyHttpServletRequestWrapper(request);
  46. String token = request.getHeader("token");
  47. if (token != null && !"".equals(token)) {
  48. requestWrapper.putCookie("SHIROSESSIONID", token);
  49. }
  50.  
  51. // finish
  52. filterChain.doFilter(requestWrapper, response);
  53. }
  54. }
  55.  
  56. /**
  57. * 修改请求头信息
  58. * @param headerses
  59. * @param request
  60. */
  61. private void modifyHeaders(Map<String, String> headerses, HttpServletRequest request) {
  62. if (headerses == null || headerses.isEmpty()) {
  63. return;
  64. }
  65. Class<? extends HttpServletRequest> requestClass = request.getClass();
  66. try {
  67. Field request1 = requestClass.getDeclaredField("request");
  68. request1.setAccessible(true);
  69. Object o = request1.get(request);
  70. Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");
  71. coyoteRequest.setAccessible(true);
  72. Object o1 = coyoteRequest.get(o);
  73. Field headers = o1.getClass().getDeclaredField("headers");
  74. headers.setAccessible(true);
  75. MimeHeaders o2 = (MimeHeaders)headers.get(o1);
  76. for (Map.Entry<String, String> entry : headerses.entrySet()) {
  77. o2.removeHeader(entry.getKey());
  78. o2.addValue(entry.getKey()).setString(entry.getValue());
  79. }
  80. } catch (Exception e) {
  81. e.printStackTrace();
  82. }
  83. }
  84.  
  85. /**
  86. * 修改cookie信息
  87. */
  88. class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper {
  89. private Map<String, String> mapCookies;
  90. ModifyHttpServletRequestWrapper(HttpServletRequest request) {
  91. super(request);
  92. this.mapCookies = new HashMap<>();
  93. }
  94. public void putCookie(String name, String value) {
  95. this.mapCookies.put(name, value);
  96. }
  97. public Cookie[] getCookies() {
  98. HttpServletRequest request = (HttpServletRequest) getRequest();
  99. Cookie[] cookies = request.getCookies();
  100. if (mapCookies == null || mapCookies.isEmpty()) {
  101. return cookies;
  102. }
  103. if (cookies == null || cookies.length == 0) {
  104. List<Cookie> cookieList = new LinkedList<>();
  105. for (Map.Entry<String, String> entry : mapCookies.entrySet()) {
  106. String key = entry.getKey();
  107. if (key != null && !"".equals(key)) {
  108. cookieList.add(new Cookie(key, entry.getValue()));
  109. }
  110. }
  111. if (cookieList.isEmpty()) {
  112. return cookies;
  113. }
  114. return cookieList.toArray(new Cookie[cookieList.size()]);
  115. } else {
  116. List<Cookie> cookieList = new ArrayList<>(Arrays.asList(cookies));
  117. for (Map.Entry<String, String> entry : mapCookies.entrySet()) {
  118. String key = entry.getKey();
  119. if (key != null && !"".equals(key)) {
  120. for (int i = 0; i < cookieList.size(); i++) {
  121. if(cookieList.get(i).getName().equals(key)){
  122. cookieList.remove(i);
  123. }
  124. }
  125. cookieList.add(new Cookie(key, entry.getValue()));
  126. }
  127. }
  128. return cookieList.toArray(new Cookie[cookieList.size()]);
  129. }
  130. }
  131. }
  132.  
  133. }

springboot项目使用拦截器修改/添加前端传输到后台header和cookie参数的更多相关文章

  1. springboot项目配置拦截器,进行登陆等拦截

    新建拦截类: public class LoginInterceptor implements HandlerInterceptor{ private static Log logger = LogF ...

  2. springweb项目自定义拦截器修改请求报文头

    面向切面,法力无边,任何脏活累活,都可以从干干净净整齐划一的业务代码中抽出来,无非就是加一层,项目里两个步骤间可以被分层的设计渗透成筛子. 举个例子: 最近我们对接某银行接口,我们的web服务都是标准 ...

  3. 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】

    一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...

  4. Springboot + redis + 注解 + 拦截器来实现接口幂等性校验

    Springboot + redis + 注解 + 拦截器来实现接口幂等性校验   1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...

  5. [十四]SpringBoot 之 Spring拦截器(HandlerInterceptor)

    过滤器属于Servlet范畴的API,与spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截 ...

  6. 在springboot中使用拦截器

    在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想 ...

  7. Struts2学习笔记(拦截器配置添加)

    一.拦截器工作原理: 根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器.(结构类似递归方式...)大部分时候,拦截器方法都 ...

  8. (vue.js)axios interceptors 拦截器中添加headers 属性

    (vue.js)axios interceptors 拦截器中添加headers 属性:http://www.codes51.com/itwd/4282111.html 问题: (vue.js)axi ...

  9. springmvc以及springboot中的拦截器配置

    拦截器两种实现   如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...

随机推荐

  1. [POJ2287][Tyvj1048]田忌赛马 (贪心+DP)

    瞎扯 很经典的一道题 考前才打 我太菜了QAQ 就是先贪心排序了好 然后在DP 这样比直接DP更容易理解 (其实这题做法还有很多) 代码 #include<cstdio> #include ...

  2. [P3385]【模板】负环 (spfa / bellman-ford)

    终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bel ...

  3. 搭建TFS 2015 Build Agent环境(四)

    在通过TFS做DI时,我们经常用到FTP文件上传.TFS发布中,提供了cURL上载文件功能.要想使用此功能,请参考下面步骤启用: 1.登录BuildAgent所在的机器 2.打开cmd(以管理员权限运 ...

  4. 4990: [Usaco2017 Feb]Why Did the Cow Cross the Road II 线段树维护dp

    题目 4990: [Usaco2017 Feb]Why Did the Cow Cross the Road II 链接 http://www.lydsy.com/JudgeOnline/proble ...

  5. python之模块2

    1.logging模块 等级 debug--->info--->warning(默认)--->error--->critical 配置两种方式: #1.congfig函数 lo ...

  6. Linux之源码安装nginx,并按照作业一描述的那样去测试使用

    作业五:源码安装nginx,并按照作业一描述的那样去测试使用 [root@localhost nginx]# yum install gcc-* glibc-* openssl openssl-dev ...

  7. openjdk for window

    https://developers.redhat.com/products/openjdk/download/ https://github.com/dmlloyd/openjdk

  8. Introducing XAML Standard and .NET Standard 2.0

    XAML Standard We are pleased to announce XAML Standard, which is a standards-based effort to unify X ...

  9. 通过IIS操作修改服务器文件没有权限的解决办法

    问题描述:通过部署在IIS上的程序去操做文件(比如删除.旋转图片等)时,在本地执行没有问题,但是部署到服务器上提示“没有权限”.解决方法:找到你需要操作的文件的根文件夹,右键点击属性 选择“安全”选项 ...

  10. [rtsp]海康IPC监控摄像头远程外网监控配置(DDNS)

        本来这个DDNS服务正是我想要的,但是配置了之后海康提示不再提供这个服务了,以后统一使用萤石云了,看来有必要去学习下萤石开放平台的api,看都提供哪些服务. 海康威视网络摄像机出厂的默认IP地 ...