首页 > 其他分享 >一个请求到达后端,会按照什么顺序执行过滤,验证,执行请求。

一个请求到达后端,会按照什么顺序执行过滤,验证,执行请求。

时间:2023-07-27 14:13:34浏览次数:29  
标签:排序 请求 token 过滤 线程 过滤器 执行

请求到达后端后,NioEndPoint对象(他提供socket接受线程、轮询socket线程、Worker线程池),在轮询中发现一个请求过来,新建一个socket接收线程SocketProcessorBase并绑定请求,一直到请求执行完毕才释放。

此接收线程放在Worker线程池里,等待执行。当执行线程时,dorun的过程中调用了invoke(request,response)的方法,首先会执行FilterChain中的Filter,第一个被执行的是OncePerRequestFilter,当实现了这个类,就会执行自定义的OncePreRequestFilter.

在OncePerRequest的定义中,说每一次请求都会执行这个过滤机制。

因此这第一道过滤可以做的事情有很多,包括对请求token的内容的第一遍筛选:1.没有token放行 2.token内容是空字符串,请求跳转到异常页面资源(getRequestDespatcher.forward(request,response))3.设置回复内容编码,例如ContentType= "application/json;charset=utf-8" 4.判断特色的请求路径例如登录请求等无需解析token 5解析token

在代码中,可以看到有一个filtersde 数组,包含了7个过滤器。下标第4第5个是自定义的过滤器。

 

 添加过滤器的时候可以设置排序,例如JWT过滤器在用户名密码认证过滤器之前。我看了源码CorsFilter的排序号是900,UserNamePasswordAuthenticationFilter的排序号是1900,

那么coreFilter的排序就是899,jwtAuthenticationTokenFilter的排序就是1899

 springSecurity将按照排序顺序进行过滤,对request和response中的数据进行处理,或者跳转,或者不处理。

其实还有好多的spring生成的过滤器,大家看看:

上面最后一个叫做FilterSecurityInterceptor,它会进行Authentication校验,在doFilter()方法中进行一系列的安全调用,他会调用父类方法

在这个类的父类AbstractSecurityInterceptor中, 方法atemptAuthentication()被调用:

 发现里面有一个成员变量this.accessDecisionManager.decide(...),从方法名和变量名看出主要是用访问决定器决定请求是否可以被访问。

 当deny>0 会抛出异常处理过程。异常是Runnable异常,也是Exception,会被被捕获,

 

调用handelAccessDeniedException:

handleAccessDeniedException调用了如下方法

 

这时候你可以实现 AuthenticationEntryPoint 自定义异常数据。

 第一种情况是出现异常最终线程把异常信息放入回复消息并返回。结束线程运行。

 

标签:排序,请求,token,过滤,线程,过滤器,执行
From: https://www.cnblogs.com/gzhich2019/p/17584592.html

相关文章

  • web | 在node中使用axios进行同步和异步请求
    web|在node中使用axios进行同步和异步请求最近在看怎么用nodejs整爬虫,摸索一下axios的使用。constaxios=require('axios');//异步写法axios("https://mz1.top") .then(res=>{ console.log("https://mz1.top"); console.log(res.headers); }) .catch(err=>......
  • 自定义过滤器写法示例
    点击查看代码@Component@Slf4j@RequiredArgsConstructorpublicclassCustomFilterextendsOncePerRequestFilter{privatefinalObjectMapperobjectMapper;/***指定要放行的接口路径*/privatestaticfinalString[]ALLOWED_PATHS={......
  • c#定时执行方事件
    c#定时执行这个是毫米级,一毫秒执行一次这是从plc1ms执行一次这个方法,获得数据,画在图上毫秒级,这么设置是1ms执行一次......
  • windchill 当点击可视化提示“您的权限不足,无法执行此操作,不进行发布操作”时如何解决
    如图情况:解决办法如图:......
  • java post请求带参数
    JavaPost请求带参数在Java程序中,我们经常需要使用HTTP来进行网络通信。其中,POST请求是一种常见的方式,用于向服务器发送数据。在POST请求中,我们可以通过参数来传递需要的数据。本文将介绍如何在Java程序中使用POST请求发送带有参数的数据,并提供相应的代码示例。什么是POST请求?HT......
  • 使用php调用python文件,执行切割pdf文件
    应用场景,使用php执行python文件,进行pdf文件切割代码如下:publicfunctionslicePdf(Request$request){//要传递给Python脚本的参数$inputPath="input.pdf";//需要切割的文件目录$outputPath="output.pdf";//切割完成以后得新文件......
  • swagger文档请求参数为文件属性添加选择文件按钮
    在编写接口时,将所有参数封装到实体中,其中就包含MultipartFile类型的参数eg:参数实体:User@ApiModel(value="用户实体类")@DatapublicclassUser{@ApiModelProperty(value="用户名")publicStringuserName;@ApiModelProperty(value="密码")public......
  • sql server 查询执行记录
    SELECTTOP1000qs.last_execution_time,DB_NAME(st.dbid)ASdatabase_name,OBJECT_NAME(st.objectid,st.dbid)ASobject_name,SUBSTRING(st.text,(qs.statement_start_offset/2)+1,((CASEqs.statement_end_offsetWHEN-1THEN......
  • java主线程等待多个子线程中任意一个有结果后,主线程继续执行
    1.背景2.代码packagecom.qianxingniwo.ls;importorg.junit.Test;importjava.util.concurrent.atomic.AtomicReference;importjava.util.concurrent.locks.LockSupport;/***@Copyright(C)XXXXX技有限公司*@Author:ldp*@Date:2023/7/2615:30*@Descri......
  • 微信小程序request请求
    request.js //新建http文件夹的request.js//constbaseUrl=require("../utils/env1").dev;//测试环境constbaseURL="https://v.api.aa1.cn/api/pyq";//公用总路径地址//专属域名//暴露出去一个函数,并且接收一个外部传入的参数exportconstrequest=(params)......