Filter介绍

Filter是Servlet规范规定的,不属于spring框架,也是用于请求的拦截。但是它适合更粗粒度的拦截,在请求前后做一些编解码处理、日志记录等。

一个Filter包括:
1)、在servlet被调用之前截获;
2)、在servlet被调用之前检查servlet request;
3)、根据需要修改request头和request数据;
4)、根据需要修改response头和response数据;
5)、在servlet被调用之后截获

实现方式

一、基于注解方式

1.编写自己的filter

import java.io.IOException;

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.annotation.WebFilter; import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.annotation.Order; /**
* 自定义过滤器
* @ClassName: CustomFilter
* @Description: 过滤器,顾名思义,能够过滤一切请求(而拦截器只能过滤action请求),包括静态资源的请求。
* chain.doFilter(request, response)表示过滤通过,能够往下执行。
* 所以过滤操作要写在chain.doFilter(request, response) 前面,作一些条件判断;
* 如果不符合条件,则不执行chain.doFilter(request, response);
* @author OnlyMate
* @Date 2018年8月28日 下午3:04:44
*
*/
@Order(1)//定义优先级
@WebFilter(filterName="CustomFilter",urlPatterns="/*")
public class CustomFilter implements Filter{
private Logger logger = LoggerFactory.getLogger(CustomFilter.class); @Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("CustomFilter ==> init method: init");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
logger.info("CustomFilter ==> doFilter method: before");
chain.doFilter(request, response);//执行请求
logger.info("CustomFilter ==> doFilter method: after");
} @Override
public void destroy() {
logger.info("CustomFilter ==> destroy method: destroy");
} }

2.配置

在项目的启动入口上加上@ServletComponentScan注解,开启扫描所有的servlet组件

@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
//使用 @EnableWebMvc 注解,需要以编程的方式指定视图文件相关配置;
//@EnableWebMvc
//使用 @EnableAutoConfiguration 注解,会读取 application.properties 或 application.yml 文件中的配置
@EnableAutoConfiguration
@ServletComponentScan//springboot启动类扫描servlet组件(过滤器)
public class Application {
public static ApplicationContext applicationContext; private static final Logger logger = LoggerFactory.getLogger(Application.class); public static void main(String[] args) {
startApplication(args);
} public static ApplicationContext startApplication(String[] args) {
if (applicationContext == null) {
logger.info(" >>> Springboot Application 开始启动...");
SpringApplicationBuilder builder = new SpringApplicationBuilder(Application.class);
SpringApplication application = builder.application();
Set<String> sources = new HashSet<>();
sources.add("classpath:applicationContext.xml");
application.setSources(sources); applicationContext = application.run(args);
logger.info(" >>> Springboot Application 启动完成!");
}
return applicationContext;
} public static ApplicationContext getApplicationContext() {
if (applicationContext == null) {
logger.error(" >>> Error:Springboot Application ApplicationContext is Null.");
}
return applicationContext;
} }

二、基于Java配置

1.编写自己的filter

import java.io.IOException;

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 org.slf4j.Logger;
import org.slf4j.LoggerFactory; /**
* 自定义过滤器
* @ClassName: CustomPlainFilter
* @Description: 过滤器,顾名思义,能够过滤一切请求(而拦截器只能过滤action请求),包括静态资源的请求。
* chain.doFilter(request, response)表示过滤通过,能够往下执行。
* 所以过滤操作要写在chain.doFilter(request, response) 前面,作一些条件判断;
* 如果不符合条件,则不执行chain.doFilter(request, response);
* @author OnlyMate
* @Date 2018年8月28日 下午3:04:44
*
*/
public class CustomPlainFilter implements Filter{
private Logger logger = LoggerFactory.getLogger(CustomPlainFilter.class); @Override
public void init(FilterConfig filterConfig) throws ServletException {
logger.info("CustomPlainFilter ==> init method: init");
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
logger.info("CustomPlainFilter ==> doFilter method: before");
chain.doFilter(request, response);//执行请求
logger.info("CustomPlainFilter ==> doFilter method: after");
} @Override
public void destroy() {
logger.info("CustomPlainFilter ==> destroy method: destroy");
} }

2.配置

自定义一个配置类

这里的配置有两种方式,第一种是通过动态代理去找"customPlainFilter"对应的实体bean,第二种方式是直接注入自定义的filter(CustomFilterConfigurer)

/**
* 自定义一个配置类
* @ClassName: CustomFilterConfigurer
* @Description: TODO
* @author OnlyMate
* @Date 2018年8月31日 下午3:25:51
*
*/
@Configuration
public class CustomFilterConfigurer {
@Bean
public FilterRegistrationBean<DelegatingFilterProxy> testFilterRegistration() { FilterRegistrationBean<DelegatingFilterProxy> registration = new FilterRegistrationBean<DelegatingFilterProxy>();
//第一种方式,使用动态代理的方式
registration.setFilter(new DelegatingFilterProxy("customPlainFilter"));
//第二种方式,直接注入一个filter
// registration.setFilter(new CustomPlainFilter());
// registration.setName("customPlainFilter");
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setEnabled(true);
registration.setDispatcherTypes(DispatcherType.REQUEST);
registration.setOrder(1);
return registration;
} @Bean(name="customPlainFilter")
public CustomPlainFilter createCustomPlainFilter() {
return new CustomPlainFilter();
}
}

效果图

总结

Spring Boot实现一个过滤器与传统的方式差别很大,有想了解的可以看之前转载别人的一篇

Spring boot下添加filter

Spring Boot实践——Filter实现的更多相关文章

  1. Spring Boot实践——Spring AOP实现之动态代理

    Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...

  2. Spring Boot实践——AOP实现

    借鉴:http://www.cnblogs.com/xrq730/p/4919025.html     https://blog.csdn.net/zhaokejin521/article/detai ...

  3. Spring Boot 实践 :Spring Boot + MyBatis

    Spring Boot 实践系列,Spring Boot + MyBatis . 目的 将 MyBatis 与 Spring Boot 应用程序一起使用来访问数据库. 本次使用的Library spr ...

  4. spring boot 实践

    二.实践 一些说明: 项目IDE采用Intellij(主要原因在于Intellij颜值完爆Eclipse,谁叫这是一个看脸的时代) 工程依赖管理采用个人比较熟悉的Maven(事实上SpringBoot ...

  5. spring boot 与 filter

    spring boot 里面用拦截器好像比用过滤器多一些. 在过滤器中, 并不能获取到action的相关信息, 会造成很多的麻烦和功能欠缺. 那, 这里就用过滤器做一个小栗子, 实际使用过程中, 不会 ...

  6. Spring Boot实践——Spring Boot 2.0 新特性和发展方向

    出自:https://mp.weixin.qq.com/s/EWmuzsgHueHcSB0WH-3AQw 以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Jav ...

  7. spring boot 实践总结(转)

    pring Boot是最流行的用于开发微服务的Java框架.在本文主要分享的是在专业开发中使用Spring Boot所采用的最佳实践.这些内容是基于个人经验和一些熟知的Spring Boot专家的文章 ...

  8. spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)

    一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...

  9. Spring Boot配置Filter

    此博客是学习Spring Boot过程中记录的,一来为了加深自己的理解,二来也希望这篇博客能帮到有需要的朋友.同时如果有错误,希望各位不吝指教 一.通过注入Bean的方式配置Filter: 注意:此方 ...

随机推荐

  1. C函数说明

    输入函数scanf_s()   比如:char d[20];写成scanf_s("%s",d,20); 输出函数printf()      比如:printf("hell ...

  2. js判断当前浏览类型

    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串var isOpera = userAgent.indexOf("Opera ...

  3. Atocder ARC082 F-Sandglass 【思维题】*

    Atocder ARC082 F-Sandglass Problem Statement We have a sandglass consisting of two bulbs, bulb A and ...

  4. modelsim仿真常用系统函数

    (1)$time 作用:返回所在模块的仿真时间,可以查看信号的出现的时间,用来把握信号的时序. 如:$display(''the time is %t'',$time) ;//显示当时的时间 (2)$ ...

  5. asp搭建网站

    测试环境:Windows 2003 下载asp源码导入 C:\Inetpub\wwwroot ###一.通过ip访问 最后浏览 浏览器输入ip或者 http://127.0.0.1 二.通过域名访问 ...

  6. geohash 精度

    关于地图的距离.  $list1=Db::name('museum')->where('id','in',$user['gz'])->order('ACOS(SIN(('.$lat.' * ...

  7. ***XX-net 和 proxyee-down

    看连接吧,留着方便自己查看 https://github.com/XX-net/XX-Net https://github.com/monkeyWie/proxyee-down/blob/master ...

  8. RK3288 USB触摸屏无法使用,需要添加PID和VID

    RK3288  Android5.1 现象:USB 接口触摸屏插到板子上,触摸屏无法使用,有可能出现更奇葩的,同一套代码,有的板子可以用,有的板子不能用. 1.打开串口调试,插上触摸屏,读取触摸屏的 ...

  9. Face detection in color images, 彩色图像中的人脸检测

    人脸检测在视频监督,人机交互,人脸识别和人脸图像数据库管理等应用领域处于很重要的地位. 论文<Face detection in color images>中给出一种在YCbCr空间检测人 ...

  10. python 文件操作的函数

    1. 文件操作的函数 open(文件名(路径), mode="?", encoding="字符集") 2. 模式: r, w, a, r+, w+, a+, r ...