当前位置: 首页 > news >正文

java网络:过滤器修改请求头

目录

一、gateway的全局过滤器

二、web的OncePerRequestFilter以及常见过滤器Filter

三、过滤器排序


一、gateway的全局过滤器

@Component
@Slf4j
public class GatewayAuthFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {Map<String, Object> jsonToken = new HashMap<>();jsonToken.put("principal", "lanjie");ArrayList<String> permissions = new ArrayList<>(Arrays.asList("getUser", "getUser1"));jsonToken.put("authorities", permissions);String token = EncryptUtil.encodeUTF8StringBase64(JSON.toJSONString(jsonToken));HttpHeaders headers = exchange.getRequest().getHeaders();
//        List<String> authorization = exchange.getRequest().getQueryParams().get("Authorization");List<String> authorization = null;try {authorization =headers.get("Authorization") ;} catch (Exception e) {e.printStackTrace();}ServerHttpRequest request=null;if(authorization==null){request = exchange.getRequest().mutate().header("json-token", token).build();}else{request= exchange.getRequest().mutate().header("json-token", token).header("jwt", authorization.get(0)).build();}//将现在的request 变成 change对象ServerWebExchange build = exchange.mutate().request(request).build();return chain.filter(build);}private List<String> getStrings(HttpHeaders headers) {List<String> authorization = headers.get("Authorization");return authorization;}@Overridepublic int getOrder() {return 0;}
}

核心部分:

request= exchange.getRequest().mutate().header("json-token", token).header("jwt", authorization.get(0)).build();

二、web的OncePerRequestFilter以及常见过滤器Filter

基于HttpServletRequest

@Component
@Slf4j
@Order(Ordered.HIGHEST_PRECEDENCE)
public class TokenAuthenticationFilter extends OncePerRequestFilter{@Overrideprotected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponsehttpServletResponse, FilterChain filterChain) throws ServletException, IOException {Enumeration<String> headerNames = httpServletRequest.getHeaderNames();String token=null;while (headerNames.hasMoreElements()) {String headerName = headerNames.nextElement();String headerValue = httpServletRequest.getHeader(headerName);if(headerName.equals("json-token")){token=headerValue;}// 处理请求头信息log.info("{}:{}",headerName,headerValue);}String jwt=httpServletRequest.getHeader("jwt");
//原有的请求头依然存在HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(httpServletRequest);requestWrapper.addHeader("Authorization",jwt);
//        String token = httpServletRequest.getHeader("json‐token");if (token != null){//1.解析tokenString json = EncryptUtil.decodeUTF8StringBase64(token);JSONObject userJson = JSON.parseObject(json);UserDTO user = new UserDTO();user.setUsername(userJson.getString("principal"));JSONArray authoritiesArray = userJson.getJSONArray("authorities");String  [] authorities = authoritiesArray.toArray( newString[authoritiesArray.size()]);
//            2.新建并填充authenticationUsernamePasswordAuthenticationToken authentication = newUsernamePasswordAuthenticationToken(user, null, AuthorityUtils.createAuthorityList(authorities));authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(httpServletRequest));//3.将authentication保存进安全上下文SecurityContextHolder.getContext().setAuthentication(authentication);}filterChain.doFilter(requestWrapper, httpServletResponse);}
}

核心代码:

//新建类并添加请求头参数
HeaderMapRequestWrapper requestWrapper = new HeaderMapRequestWrapper(httpServletRequest);requestWrapper.addHeader("Authorization",jwt);//返回
filterChain.doFilter(requestWrapper, httpServletResponse);

封装类

package cn.itcast.order.utils;import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;/*** @Auther: lan* @Date: 2024/5/23 12:00* @Description:*/
public class HeaderMapRequestWrapper  extends HttpServletRequestWrapper{public HeaderMapRequestWrapper(HttpServletRequest request) {super(request);}private Map<String, String> headerMap = new HashMap<String, String>();/*** add a header with given name and value** @param name* @param value*/public void addHeader(String name, String value) {headerMap.put(name, value);}@Overridepublic String getHeader(String name) {String headerValue = super.getHeader(name);if (headerMap.containsKey(name)) {headerValue = headerMap.get(name);}return headerValue;}/*** get the Header names*/@Overridepublic Enumeration<String> getHeaderNames() {List<String> names = Collections.list(super.getHeaderNames());for (String name : headerMap.keySet()) {names.add(name);}return Collections.enumeration(names);}@Overridepublic Enumeration<String> getHeaders(String name) {List<String> values = Collections.list(super.getHeaders(name));if (headerMap.containsKey(name)) {values.add(headerMap.get(name));}return Collections.enumeration(values);}
}

三、过滤器排序

有时候存在使用@Order(1) 不生效

如oauth2的过滤器即使order值比较大 仍会先执行

使用:表示最优先

@Order(Ordered.HIGHEST_PRECEDENCE)

第二优先:

@Order(Ordered.HIGHEST_PRECEDENCE+1)

以此类推

相关文章:

  • 一、Elasticsearch介绍与部署
  • 【知识拓展】LocalTunnel-高性价比的内网穿透工具(2)
  • matplotlib latex表格
  • 每日一题---有效的括号问题
  • 双指针用法练习题(2024/5/26)
  • 通过unsplash引入图片素材
  • 小程序的深层了解
  • React 如何自定义 Hooks
  • Win11禁用数字强制签名:解放硬件选择,自由安装应用
  • CasaOS系统玩客云安装内网穿透工具实现无公网IP远程访问
  • 内存函数详解,包含部分字符串函数
  • 深入理解python列表与字典:数据结构的选择与性能差异
  • 07、SpringBoot 源码分析 - SpringApplication启动流程七
  • 入门五(项目介绍及登录和发布需求)
  • k8s 创建 LoadBalancer 类型的 svc
  • ----------
  • @angular/forms 源码解析之双向绑定
  • [ 一起学React系列 -- 8 ] React中的文件上传
  • [译] 怎样写一个基础的编译器
  • Babel配置的不完全指南
  • bootstrap创建登录注册页面
  • crontab执行失败的多种原因
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Fabric架构演变之路
  • Java,console输出实时的转向GUI textbox
  • javascript 哈希表
  • JavaScript实现分页效果
  • java正则表式的使用
  • Map集合、散列表、红黑树介绍
  • python学习笔记 - ThreadLocal
  • Redis字符串类型内部编码剖析
  • 彻底搞懂浏览器Event-loop
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 前端性能优化——回流与重绘
  • 我这样减少了26.5M Java内存!
  • 延迟脚本的方式
  • 中文输入法与React文本输入框的问题与解决方案
  • ​​​​​​​​​​​​​​Γ函数
  • ​ssh免密码登录设置及问题总结
  • ​马来语翻译中文去哪比较好?
  • #职场发展#其他
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Repost) Getting Genode with TrustZone on the i.MX
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (图)IntelliTrace Tools 跟踪云端程序
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .htaccess 强制https 单独排除某个目录
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET/C# 中你可以在代码中写多个 Main 函数,然后按需要随时切换
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .py文件应该怎样打开?
  • .vue文件怎么使用_vue调试工具vue-devtools的安装
  • [ C++ ] STL---string类的模拟实现
  • []常用AT命令解释()