springBoot过滤器、拦截器配置使用

2022年12月4日08:27:14

拦截器与过滤器的区别

  1. 拦截器是基于java的反射机制的,而过滤器是基于函数回调。
  2. 拦截器不依赖与servlet容器,过滤器依赖与servlet容器。
  3. 拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。
  4. 拦截器可以访问action上下文、值栈里的对象,而过滤器不能访问。
  5. 在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次拦截器的代
    码实现。
  6. Filter基于回调函数,我们需要实现的filter接口中doFilter方法就是回调函数,而interceptor则基于
    java本身的反射机制,这是两者最本质的区别。
  7. Filter是依赖于servlet容器的,即只能在servlet容器中执行,很显然没有servlet容器就无法来回调
    doFilter方法。而interceptor与servlet容器无关。
  8. Filter的过滤范围比Interceptor大,Filter除了过滤请求外通过通配符可以保护页面,图片,文件等等,
    而Interceptor只能过滤请求。
  9. Filter的过滤例外一般是在加载的时候在init方法声明,而Interceptor可以通过声明是guest请求还
    是user请求来辨别是否过滤。
    一.过滤器
    1.不使用springSecurity时,添加过滤器在启动类中增加
    MyFilter需继承Filter
@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){
		//具体业务逻辑
	}
}
  • 作者:softwareDragon
  • 原文链接:https://blog.csdn.net/qq_33348135/article/details/123178077
    更新时间:2022年12月4日08:27:14 ,共 2176 字。