请求到达后端后,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