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()]); } } } }
分类:
Java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
2017-06-20 【转】学习jar命令 创建和解压jar文件包
2017-06-20 git 撤销commit
2016-06-20 Spring MVC全局异常后返回JSON异常数据
2016-06-20 spring mvc 异常统一处理方式
2016-06-20 Duplicate fragment name ERROR Jetty Maven Plugin
2016-06-20 Eclipse使用入门指南及技巧
2015-06-20 魅蓝Note2跑分 MT6753性能究竟如何