spring中的Filter使用

Filter何时进行url过滤

filter(过滤器)作用于在intreceptor(拦截器)之前,不像intreceptor一样依赖于springmvc框架,只需要依赖于serverlet。

Filter在spring /springboot中如何使用

1.自定义Filter

比较原始的一种方法是定义一个MyFilter实现javax.servlet.Filter接口

public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 对request或 response 进行处理
        // 调用filter链中的下一个filter
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

另一种方法的自定义Filter,继承springframework.web.filter.OncePerRequestFilter,可以对同一个请求,只经过一次过滤

public class MyFilter extends OncePerRequestFilter {
    /**此处不能@override doFilter方法
     *  因为OncePerRequestFilter中 doFilter方法已经是final
     *
     */
    
    //自定义处理方法
    public void interrupt(HttpServletResponse response, ErrorCode code){
        //此处对response进行处理
    }

    //重载OnecePerRequestFilter方法
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain){
    //调用自定义处理方法
    interrupt(response,code);
    //对request 、response进行处理
    }
    
}

OncePerRequestFilter中的方法

修饰符和类型方法和描述
voiddoFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)

doFilter实现存储“已过滤”的请求属性,如果属性已经存在,则继续进行而不再过滤。

protected abstract voiddoFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)

和doFilter相同功能,但保证在单个请求线程中每个请求只调用一次。

protected java.lang.StringgetAlreadyFilteredAttributeName()

返回标识已过滤请求的请求属性的名称。

protected booleanisAsyncDispatch(HttpServletRequest request)

javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的调度程序类型意味着可以在单个请求的过程中在多个线程中调用过滤器。

protected booleanisAsyncStarted(HttpServletRequest request)

请求处理是否处于异步模式,这意味着在退出当前线程后不会提交响应

protected booleanshouldNotFilter(HttpServletRequest request)

可以在子类中重写以进行自定义筛选控制,返回true以避免过滤给定的请求。

protected booleanshouldNotFilterAsyncDispatch()

javax.servlet.DispatcherType.ASYNCServlet 3.0中引入的调度程序类型意味着可以在单个请求的过程中在多个线程中调用过滤器。

protected booleanshouldNotFilterErrorDispatch()

是否过滤错误调度,例如servlet容器处理和映射错误时web.xml

2.注册自定义Filter

在springboot中可以写一个配置类,使用@Bean注入myFilterBean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.boot.web.servlet.FilterRegistrationBean;

@Configuration
public class MyFilterConfig {
   @Bean
    public FilterRegistrationBean myFilterBean(MyFilter filter) {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(filter);//设置为自定义的过滤器MyFilter
        filterRegistrationBean.addUrlPatterns("/*");//拦截所有请求
        filterRegistrationBean.setOrder(1);//优先级为1
        return filterRegistrationBean;
    }
    //可注册多个自定义的过滤器
}

如果是使用xml配置则在web.xml配置如下( 注意配置多个filter时优先级由filter的配置顺序决定优先级)

<filter>
    <filter-name>myFilter</filter-name>
    <filter-class>com.text.filter.myFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>myFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

 

  • 4
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Spring Security 使用 Filter 来处理身份验证和授权。它提供了一组 Filter,用于拦截和处理请求。 在 Spring Security ,最重要的 Filter 是 `FilterChainProxy`。它是一个特殊的 Filter,负责管理一组其他 Filter,这些 Filter 一起构成了一个过滤器链。 以下是 Spring Security 常用的 Filter: 1. `UsernamePasswordAuthenticationFilter`:用于处理基于表单的身份验证请求,并根据提供的用户名和密码进行身份验证。 2. `BasicAuthenticationFilter`:用于处理基于 HTTP 基本身份验证的请求。 3. `RememberMeAuthenticationFilter`:用于处理 "记住我" 功能的请求。 4. `AnonymousAuthenticationFilter`:用于为匿名用户提供默认的身份验证。 5. `ExceptionTranslationFilter`:用于捕获和处理身份验证和授权异常,并将其转换为适当的 HTTP 响应。 6. `FilterSecurityInterceptor`:用于基于访问决策器(Access Decision Manager)进行访问控制的主要过滤器。 你可以使用 Spring Security 的配置类来配置这些 Filter,并定义它们的顺序和应用规则。例如,你可以通过继承 `WebSecurityConfigurerAdapter` 类并重写 `configure(HttpSecurity http)` 方法来配置 Spring Security 过滤器链。 示例代码如下: ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .permitAll(); } } ``` 在上述示例,`configure(HttpSecurity http)` 方法配置了一个过滤器链,其包含了 `UsernamePasswordAuthenticationFilter`、`ExceptionTranslationFilter` 等等。 这只是一个简单的示例,你可以根据自己的需求添加和配置其他的过滤器。希望这能帮到你!如果还有其他问题,请继续提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值