拦截器与过滤器的区别 :
@Bean public FilterRegistrationBean myFilter(){ FilterRegistrationBean registrationBean=new FilterRegistrationBean(); FilterRegistrationBean.setName("myFilter"); MyFilter mf=new MyFilter(); //spring boot 会按照order值的大小,从小到大的顺序来依次过滤 registrationBean.setOrder(0); registration.addUrlPatterns("/*"); return registration; }
使用springSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter{ @Override protected void configure(HttpSecurity httpSecurity) throws Exception { //退出访问/logout时,执行logoutSuccessHandler这个处理器 httpSecurity.logout().logoutUrl("/logout").logoutSuccessHandler(logoutSuccessHandler); //添加过滤器,先执行AFilter,再执行authenticationTokenFilter httpSecurity.addFilterBefore(authenticationTokenFilter, AFilter.class); } }
得继承OncePerRequestFilter
@Component
@Order(1)//指定执行顺序
public JwtAuthenticationTokenFilter extends OncePerRequestFilter
二:拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略
1.一般使用
MyInterceptor需继承HandlerInterceptor
@Configuration public class MyMvcConfigurer implements WebMvcConfigurer{ @Override public void addInterceptors(InterceptorRegistry registry){ //添加自定义拦截器 MyInterceptor mi=new MyInterceptor(); InterceptorRegistration i=registry.addInterceptor(mi); //拦截哪些路径 i.addPathPatterns(new String[]{"/**"}); //不拦截哪些路径 i.excludePathPatterns(new String[]{"/a"}); } }
2.在后端数据返回到前端时做一些处理
@ControllerAdvice public class MRSBA implements ResponseBodyAdvice{ @Override //obj为返回的数据 mt为数据格式类型 public Object beforeBodyWrite(Object obj,MethodParameter param,,MediaType mt,Class converter,ServerHttpRequest httpRequest,ServerHttpResponse httpResponse){ //具体业务逻辑 } }