springboot项目使用拦截器修改/添加前端传输到后台header和cookie参数
本质上来讲,request请求当中的参数是无法更改的,也不能添加或者删除。
但在后台程序中,一般对request的参数的操作,都是通过request的getParameter、getParameterNames、getParameterValues等方法执行的;所以我们要是能重写这些方法,就从侧面改变了request的请求参数。恰好,servlet就提供了一个HttpServletRequestWrapper类来供大家去继承(该类是HttpServletRequest的封装类),重写request相关方法。
这样可以修改比如shiro框架中的JSESSIONID,使单页H5中调用接口时只需要在头部添加在别处登录之后拿到的jsessionid的值,就能保证是登录状态。
具体服务端实现如下:
- package webapp.conf;
- import org.apache.tomcat.util.http.MimeHeaders;
- import org.springframework.boot.web.servlet.FilterRegistrationBean;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
- import org.springframework.web.filter.OncePerRequestFilter;
- import javax.servlet.*;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletRequestWrapper;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- import java.lang.reflect.Field;
- import java.util.*;
- /**
- * 拦截器配置
- */
- @Configuration
- public class FilterConfig {
- @Bean
- public FilterRegistrationBean modifyParametersFilter() {
- FilterRegistrationBean registration = new FilterRegistrationBean();
- registration.setFilter(new ModifyParametersFilter());
- registration.addUrlPatterns("/*"); // 拦截路径
- registration.setName("modifyParametersFilter"); // 拦截器名称
- registration.setOrder(1); // 顺序
- return registration;
- }
- /**
- * 自定义拦截器
- */
- class ModifyParametersFilter extends OncePerRequestFilter {
- @Override
- protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
- // 修改请求头
- Map<String, String> map = new HashMap<>();
- modifyHeaders(map, request);
- // 修改cookie
- ModifyHttpServletRequestWrapper requestWrapper = new ModifyHttpServletRequestWrapper(request);
- String token = request.getHeader("token");
- if (token != null && !"".equals(token)) {
- requestWrapper.putCookie("SHIROSESSIONID", token);
- }
- // finish
- filterChain.doFilter(requestWrapper, response);
- }
- }
- /**
- * 修改请求头信息
- * @param headerses
- * @param request
- */
- private void modifyHeaders(Map<String, String> headerses, HttpServletRequest request) {
- if (headerses == null || headerses.isEmpty()) {
- return;
- }
- Class<? extends HttpServletRequest> requestClass = request.getClass();
- try {
- Field request1 = requestClass.getDeclaredField("request");
- request1.setAccessible(true);
- Object o = request1.get(request);
- Field coyoteRequest = o.getClass().getDeclaredField("coyoteRequest");
- coyoteRequest.setAccessible(true);
- Object o1 = coyoteRequest.get(o);
- Field headers = o1.getClass().getDeclaredField("headers");
- headers.setAccessible(true);
- MimeHeaders o2 = (MimeHeaders)headers.get(o1);
- for (Map.Entry<String, String> entry : headerses.entrySet()) {
- o2.removeHeader(entry.getKey());
- o2.addValue(entry.getKey()).setString(entry.getValue());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * 修改cookie信息
- */
- class ModifyHttpServletRequestWrapper extends HttpServletRequestWrapper {
- private Map<String, String> mapCookies;
- ModifyHttpServletRequestWrapper(HttpServletRequest request) {
- super(request);
- this.mapCookies = new HashMap<>();
- }
- public void putCookie(String name, String value) {
- this.mapCookies.put(name, value);
- }
- public Cookie[] getCookies() {
- HttpServletRequest request = (HttpServletRequest) getRequest();
- Cookie[] cookies = request.getCookies();
- if (mapCookies == null || mapCookies.isEmpty()) {
- return cookies;
- }
- if (cookies == null || cookies.length == 0) {
- List<Cookie> cookieList = new LinkedList<>();
- for (Map.Entry<String, String> entry : mapCookies.entrySet()) {
- String key = entry.getKey();
- if (key != null && !"".equals(key)) {
- cookieList.add(new Cookie(key, entry.getValue()));
- }
- }
- if (cookieList.isEmpty()) {
- return cookies;
- }
- return cookieList.toArray(new Cookie[cookieList.size()]);
- } else {
- List<Cookie> cookieList = new ArrayList<>(Arrays.asList(cookies));
- for (Map.Entry<String, String> entry : mapCookies.entrySet()) {
- String key = entry.getKey();
- if (key != null && !"".equals(key)) {
- for (int i = 0; i < cookieList.size(); i++) {
- if(cookieList.get(i).getName().equals(key)){
- cookieList.remove(i);
- }
- }
- cookieList.add(new Cookie(key, entry.getValue()));
- }
- }
- return cookieList.toArray(new Cookie[cookieList.size()]);
- }
- }
- }
- }
springboot项目使用拦截器修改/添加前端传输到后台header和cookie参数的更多相关文章
- springboot项目配置拦截器,进行登陆等拦截
新建拦截类: public class LoginInterceptor implements HandlerInterceptor{ private static Log logger = LogF ...
- springweb项目自定义拦截器修改请求报文头
面向切面,法力无边,任何脏活累活,都可以从干干净净整齐划一的业务代码中抽出来,无非就是加一层,项目里两个步骤间可以被分层的设计渗透成筛子. 举个例子: 最近我们对接某银行接口,我们的web服务都是标准 ...
- 【Java EE 学习 75 下】【数据采集系统第七天】【二进制运算实现权限管理】【使用反射初始化权限表】【权限捕获拦截器动态添加权限】
一.使用反射动态添加权限 在该系统中,我使用struts2的时候非常规范,访问的Action的形式都是"ActionClassName_MethodName.action?参数列表" ...
- Springboot + redis + 注解 + 拦截器来实现接口幂等性校验
Springboot + redis + 注解 + 拦截器来实现接口幂等性校验 1. SpringBoot 整合篇 2. 手写一套迷你版HTTP服务器 3. 记住:永远不要在MySQL中使用UTF ...
- [十四]SpringBoot 之 Spring拦截器(HandlerInterceptor)
过滤器属于Servlet范畴的API,与spring 没什么关系. Web开发中,我们除了使用 Filter 来过滤请web求外,还可以使用Spring提供的HandlerInterceptor(拦截 ...
- 在springboot中使用拦截器
在springMVC中可以实现拦截器,是通过实现HandlerInterceptor接口,然后在springmvc-web.xml中配置就可以使用拦截器了.在springboot中拦截器也是一样的思想 ...
- Struts2学习笔记(拦截器配置添加)
一.拦截器工作原理: 根据Struts2的工作原理图,拦截器在action执行前进行顺序调用,之后执行Action并返回结果字符串,再逆序调用拦截器.(结构类似递归方式...)大部分时候,拦截器方法都 ...
- (vue.js)axios interceptors 拦截器中添加headers 属性
(vue.js)axios interceptors 拦截器中添加headers 属性:http://www.codes51.com/itwd/4282111.html 问题: (vue.js)axi ...
- springmvc以及springboot中的拦截器配置
拦截器两种实现 如果不同的controller中都需要拦截器,不能使用相同的拦截器,因为拦截器不能跨controller,这个时候只能为不同的controller配置不同的拦截器,每一个拦截器只能 ...
随机推荐
- [POJ2287][Tyvj1048]田忌赛马 (贪心+DP)
瞎扯 很经典的一道题 考前才打 我太菜了QAQ 就是先贪心排序了好 然后在DP 这样比直接DP更容易理解 (其实这题做法还有很多) 代码 #include<cstdio> #include ...
- [P3385]【模板】负环 (spfa / bellman-ford)
终于开始认真对待图论了 因为听说一直是提高组的,动得很少,直到现在机房打提高的氛围下,开始学一些皮毛的东西 模板题目链接 这是一道求负环的题目,照理来说大家都是用spfa来判断负环的 但是我觉得bel ...
- 搭建TFS 2015 Build Agent环境(四)
在通过TFS做DI时,我们经常用到FTP文件上传.TFS发布中,提供了cURL上载文件功能.要想使用此功能,请参考下面步骤启用: 1.登录BuildAgent所在的机器 2.打开cmd(以管理员权限运 ...
- 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 ...
- python之模块2
1.logging模块 等级 debug--->info--->warning(默认)--->error--->critical 配置两种方式: #1.congfig函数 lo ...
- Linux之源码安装nginx,并按照作业一描述的那样去测试使用
作业五:源码安装nginx,并按照作业一描述的那样去测试使用 [root@localhost nginx]# yum install gcc-* glibc-* openssl openssl-dev ...
- openjdk for window
https://developers.redhat.com/products/openjdk/download/ https://github.com/dmlloyd/openjdk
- 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 ...
- 通过IIS操作修改服务器文件没有权限的解决办法
问题描述:通过部署在IIS上的程序去操做文件(比如删除.旋转图片等)时,在本地执行没有问题,但是部署到服务器上提示“没有权限”.解决方法:找到你需要操作的文件的根文件夹,右键点击属性 选择“安全”选项 ...
- [rtsp]海康IPC监控摄像头远程外网监控配置(DDNS)
本来这个DDNS服务正是我想要的,但是配置了之后海康提示不再提供这个服务了,以后统一使用萤石云了,看来有必要去学习下萤石开放平台的api,看都提供哪些服务. 海康威视网络摄像机出厂的默认IP地 ...