Spring Boot实践——Filter实现
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实现的更多相关文章
- Spring Boot实践——Spring AOP实现之动态代理
Spring AOP 介绍 AOP的介绍可以查看 Spring Boot实践——AOP实现 与AspectJ的静态代理不同,Spring AOP使用的动态代理,所谓的动态代理就是说AOP框架不会去修改 ...
- Spring Boot实践——AOP实现
借鉴:http://www.cnblogs.com/xrq730/p/4919025.html https://blog.csdn.net/zhaokejin521/article/detai ...
- Spring Boot 实践 :Spring Boot + MyBatis
Spring Boot 实践系列,Spring Boot + MyBatis . 目的 将 MyBatis 与 Spring Boot 应用程序一起使用来访问数据库. 本次使用的Library spr ...
- spring boot 实践
二.实践 一些说明: 项目IDE采用Intellij(主要原因在于Intellij颜值完爆Eclipse,谁叫这是一个看脸的时代) 工程依赖管理采用个人比较熟悉的Maven(事实上SpringBoot ...
- spring boot 与 filter
spring boot 里面用拦截器好像比用过滤器多一些. 在过滤器中, 并不能获取到action的相关信息, 会造成很多的麻烦和功能欠缺. 那, 这里就用过滤器做一个小栗子, 实际使用过程中, 不会 ...
- Spring Boot实践——Spring Boot 2.0 新特性和发展方向
出自:https://mp.weixin.qq.com/s/EWmuzsgHueHcSB0WH-3AQw 以Java 8 为基准 Spring Boot 2.0 要求Java 版本必须8以上, Jav ...
- spring boot 实践总结(转)
pring Boot是最流行的用于开发微服务的Java框架.在本文主要分享的是在专业开发中使用Spring Boot所采用的最佳实践.这些内容是基于个人经验和一些熟知的Spring Boot专家的文章 ...
- spring boot: 通过filter过滤器实现中文的简体繁体字符集转换(spring boot 2.3.1)
一,为什么要使用filter来实现简繁体转换? 项目中有时会有同时支持简体和繁体两种字符集的要求, 或者搜索引擎有支持繁体输入字符的需求. 针对繁体字符的显示, 我们通常会在数据库和模板.文案配置中默 ...
- Spring Boot配置Filter
此博客是学习Spring Boot过程中记录的,一来为了加深自己的理解,二来也希望这篇博客能帮到有需要的朋友.同时如果有错误,希望各位不吝指教 一.通过注入Bean的方式配置Filter: 注意:此方 ...
随机推荐
- Hadoop2.x下安装HBase
1.安装好 hadoop 集群,并启动 [grid@hadoop4 ~]$ /sbin/start-dfs.sh [grid@hadoop4 ~]$ /sbin/start-yarn.sh 查看 ha ...
- [译]HIPAA要求的SSL/TLS等级
原文链接:https://luxsci.com/blog/level-ssl-tls-required-hipaa.html 原文发表时间:2015.1.13 本博文仅仅是上述原文的翻译,仅供研究参考 ...
- BZOJ1227 SDOI2009 虔诚的墓主人【树状数组+组合数】【好题】*
BZOJ1227 SDOI2009 虔诚的墓主人 Description 小W 是一片新造公墓的管理人.公墓可以看成一块N×M 的矩形,矩形的每个格点,要么种着一棵常青树,要么是一块还没有归属的墓地. ...
- mysql 查找多个值并且取最大值一个和分组
SELECT eco_truename, eco_uid, max(checkup_time) AS time FROM es_checkup_order WHERE checkup_time GRO ...
- 洛谷P1309 瑞士轮
传送门 题目大意: 2*n个人,有初始的比赛分数和实力值. 每次比赛前总分从大到小排序,总分相同编号小的排在前面. 每次比赛是1和2比,3和4比,5和6比. 实力值大的获胜得1分. 每次比赛前排序确定 ...
- sql server2008升级
安装了试用版的sql server2008,要升级为正式企业版.仅仅须要使用安装程序的 维护-升级 功能.在升级时输入企业版序列号,就能升级为正式版.以下给两个序列号 开发版: PTTFM-X467G ...
- eclipse marketplace网络连接失败的解决方法
2015-12-04 01:12:33 本想在eclipse上安装一个插件,点进help-EclipseMarketplace却连接失败,错误如下: 在help-instal new software ...
- [LeetCode系列]BST有效性确定问题[前序遍历]
给定一个BST的根节点, 试判断此BST是否为符合规则的BST? 规则: 对于一个BST的节点, 它左侧的所有节点(包括子节点)必须小于它本身; 它右侧的所有节点(包括子节点)必须大于它本身; 它的左 ...
- 【转】简明 Python 教程
原文网址:http://woodpecker.org.cn/abyteofpython_cn/chinese/ 简明 Python 教程Swaroop, C. H. 著沈洁元 译www.byteof ...
- 【转】理解Linux 配置文件
原文网址:http://www.mike.org.cn/articles/understanding-linux-configuration-files-linux/ 介绍每个 Linux 程序都是一 ...