SpringBoot过滤器

栏目: Java · 发布时间: 6年前

内容简介:这是Spring过滤器案例,过滤器能够实在正常功能之外实现类似插件功能。过滤器通过三种方式实现:1.使用FilterRegistrationBean类:提供增加URL映射的方法,设置过滤器顺序。

SpringBoot过滤器Filter

这是Spring过滤器案例,过滤器能够实在正常功能之外实现类似插件功能。

过滤器通过三种方式实现:

1.使用FilterRegistrationBean类:提供增加URL映射的方法,设置过滤器顺序。

2. @Component 注释:无法改变默认的URL映射,通过@Order注释设置过滤器顺序。

3. @ServletComponentScan 注释:过滤器必须使用@WebFilter注释,能够通过它的urlPattern属性增加URL映射,但是无法设置过滤器顺序,只在使用嵌入服务器才有效。

1. 使用的技术Technologies Used

使用了下面的技术栈:.

1. Java 9

2. Spring 5.0.7.RELEASE

3. Spring Boot 2.0.3.RELEASE

4. Maven 3.5.2

5. Eclipse Oxygen

2. pom.xml

没有什么特别,主要是两个常用依赖,与Filter关系不大:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

3. 使用FilterRegistrationBean注册过滤器

FilterRegistrationBean 能够在 Servlet 3.0 + 容器注册过滤器,作为一个Spring bean注册的. 它的一些方法如下:

setFilter(): 设置过滤器对象. 

addUrlPatterns(): 增加 URL mappings. 

setOrder(): 设置过滤器顺序. 

下面是使用JavaConfig注册ABCFilter和XYZFilter 类.

WebConfig.java

package com.example.springfilter;

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

@Configuration
public class WebConfig {
   //Register ABCFilter
   @Bean
   public FilterRegistrationBean<ABCFilter> abcFilter() {
      FilterRegistrationBean<ABCFilter> filterRegBean = new FilterRegistrationBean<>();
      filterRegBean.setFilter(new ABCFilter());
      filterRegBean.addUrlPatterns("/app/*");
      filterRegBean.setOrder(Ordered.LOWEST_PRECEDENCE -1);
      return filterRegBean;
   }
   //Register XYZFilter
   @Bean
   public FilterRegistrationBean<XYZFilter> xyzFilter() {
      FilterRegistrationBean<XYZFilter> filterRegBean = new FilterRegistrationBean<>();
      filterRegBean.setFilter(new XYZFilter());
      filterRegBean.addUrlPatterns("/app/*");
      filterRegBean.setOrder(Ordered.LOWEST_PRECEDENCE -2);
      return filterRegBean;
   }
} 

AbcFilter/XYZFilter其实是一个Java servlet的过滤器:

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public class ABCFilter implements Filter {
   @Override
   public void init(FilterConfig filterConfig) throws ServletException {
   }
   @Override
   public void doFilter(ServletRequest request, ServletResponse response,
                   FilterChain chain) throws IOException, ServletException {
      HttpServletRequest req = (HttpServletRequest) request;
      System.out.println("Inside ABCFilter: "+ req.getRequestURI());
      chain.doFilter(request, response);
   }
   @Override
   public void destroy() {
   }
}

3.1. 过滤URL模式

通过使用FilterRegistrationBean的 addUrlPatterns() 或 setUrlPatterns() 方法实现URL的过滤模式,比如对 /app1/* 和 /app2/* 过滤

filterRegBean.addUrlPatterns("/app1/*", "/app2/*");

如果使用 setUrlPatterns(), 如下:这是一次性的设置一个集合。.

filterRegBean.setUrlPatterns(Arrays.asList("/app1/*", "/app2/*"));

3.2. 过滤器顺序

当我们使用FilterRegistrationBean实现过滤器, 能够使用setOrder() 设置舒心:

filterRegBean.setOrder(Ordered.LOWEST_PRECEDENCE);

Ordered.HIGHEST_PRECEDENCE: 这是最高优先.

Ordered.LOWEST_PRECEDENCE: 这是最低优先

顺序号越低,优先权越高. 

Example-1:

Ordered.LOWEST_PRECEDENCE -2 > Ordered.LOWEST_PRECEDENCE -1

Example-2:

Ordered.HIGHEST_PRECEDENCE +1 > Ordered.HIGHEST_PRECEDENCE +2

无序排列过滤器也是安全的,Spring boot提供默认的顺序,通常使用Ordered.LOWEST_PRECEDENCE.如果我们想在任何内置过滤器(如Spring安全过滤器)之前或之后运行我们的自定义过滤器,我们需要使用FilterRegistrationBean对它们进行排序。比如我们想在Spring安全过滤器之后运行我们的自定义过滤器,我们需要用FilterRegistrationBean为Spring安全过滤器创建自己的过滤器并指定顺序。

4. 使用@Component 和 @Order 实现过滤器

我们可以使用注册过滤器@Component并设置顺序@Order。创建一个实现 Java 的过滤器Filter,并使用Spring @Component对其进行注释,如下所示。

ABCFilter.java

@Order(Ordered.LOWEST_PRECEDENCE -1)
@Component
public class ABCFilter implements Filter {  ------
}

XYZFilter.java

@Order(Ordered.LOWEST_PRECEDENCE -2)
@Component
public class XYZFilter implements Filter {  ------
}

过滤器顺序

当我们使用@Component注册过滤器时,我们可以使用Spring @Order注释将过滤器顺序设置为

@Order(Ordered.LOWEST_PRECEDENCE)

过滤器URL模式过滤无法使用 @Component

URL模式默认过滤器URL模式为"/*"。如果我们使用@Component注释注册过滤器,我们无法更改它。如果我们想要过滤URL映射,我们应该使用注册过滤器FilterRegistrationBean。

5. 使用 @ServletComponentScan 和 @WebFilter实现过滤器

要在Spring Boot中注册过滤器,我们可以使用@ServletComponentScan,过滤器应该注释@WebFilter注解。我们需要使用@ServletComponentScan与@Configuration或@SpringBootApplication注释组合。@ServletComponentScan在Spring Boot中,将扫描带有@WebServlet注释的servlet ,带有注释的过滤器@WebFilter和@WebListener仅在使用嵌入式Web服务器时才会扫描到的侦听器。假设我们有两个带有@WebFilter以下注释的过滤器。 .

ABCFilter.java

@WebFilter(urlPatterns="/app/*")
public class ABCFilter implements Filter {  ------
}

XYZFilter.java

@WebFilter(urlPatterns="/app/*")
public class XYZFilter implements Filter {  ------
}

现在使用Spring boot starter Main class @ServletComponentScan来扫描上面的过滤器。

SpringBootAppStarter.java

@ServletComponentScan
@SpringBootApplication
public class SpringfilterApplication {

   public static void main(String[] args) {
      SpringApplication.run(SpringfilterApplication.class, args);
   }
}

过滤器 URL模式

注释@WebFilter具有urlPatterns映射URL 的属性,如下所示。

@WebFilter(urlPatterns= {"/app1/*", "/app2/*"})
public class ABCFilter implements Filter {   ------
}

无法使用 @WebFilter设置过滤顺序

当我们使用@WebFilterthen 注册过滤器时,我们无法在Spring Boot中对它们进行排序。@WebFilter不提供任何设置顺序的属性。我们也不能使用Spring @Order注释,因为Spring没有将@WebFilter注释类标识为Spring bean。@WebFilter是一个Java注释而不是Spring注释。如果我们想要设置顺序,我们应该使用注册我们的过滤器FilterRegistrationBean。.

Spring cloud


以上所述就是小编给大家介绍的《SpringBoot过滤器》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

High Performance JavaScript

High Performance JavaScript

Nicholas C. Zakas / O'Reilly Media / 2010-4-2 / USD 34.99

If you're like most developers, you rely heavily on JavaScript to build interactive and quick-responding web applications. The problem is that all of those lines of JavaScript code can slow down your ......一起来看看 《High Performance JavaScript》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具