当前位置: 首页 > 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)

以此类推

http://www.lryc.cn/news/358103.html

相关文章:

  • yolov10 快速使用及训练
  • CSS变量 -- var() 使用教程
  • python基础-数据结构-leetcode刷题必看-queue---队列-python的底层构建
  • 深入理解Spring Security:保护你的Web应用程序
  • 【车载开发系列】Vector工具链的安装
  • Windows系统部署YOLOv5 v6.1版本的训练与推理环境保姆级教程
  • [RK3588-Android12] 关于EDP屏外设为Panel,不支持HPD的配置
  • 142.栈和队列:用栈实现队列(力扣)
  • 乡村振兴的乡村产业创新发展:培育乡村新兴产业,打造乡村产业新名片,促进乡村经济多元化发展
  • 数据库|基于T-SQL创建数据库
  • 智能家居ZigBee网关选型定制指南:主控,操作系统,天线设计,助力IoT开发者
  • QT截图程序,可多屏幕截图二,增加调整截图区域功能
  • 开源浪潮与闭源堡垒:大模型未来的双重奏
  • postman教程-6-发送delete请求
  • java小技能: 数字和字母组合的验证码图片(生成验证码字符并加上噪点,干扰线)
  • 网络故障与排除
  • Cocos Creator 编辑器的数据绑定详解
  • 解决Selenium NameError: name ‘By’ is not defined
  • 创建特定结构的二维数组:技巧与示例
  • React Native 之 BackHandler (二十)
  • 一篇文章讲透排序算法之快速排序
  • kubernetes-PV与PVC、存储卷
  • 643. 子数组最大平均数 I
  • Node性能如何进行监控以及优化?
  • ToList()和ToArray()的区别
  • 11.RedHat认证-Linux文件系统(中)
  • windows系统电脑外插键盘驱动出现感叹号或者显示未知设备,键盘无法输入的解决办法
  • 【开源项目】Excel数据表自动生成工具v1.0版
  • Docker-一文详解容器通信的基础网络模式及衍生的自定义网络模式
  • Convolutional Occupancy Networks【ECCV】