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. ueditor使用小结【来源网络】

    原文地址:http://www.cnblogs.com/janes/p/5072496.html ueditor是百度编辑器,官网地址:http://ueditor.baidu.com/website ...

  2. ss client 配置

    1.1安装ss apt-get install python-pippip install shadowsocks 1.2配置ss 新建一个配置文件config.json/etc/shadowsock ...

  3. iOS应用截屏

    iPhone自从推出后就自带了截屏功能,简单而易用,所以应用就没什么截屏的需求了,不过有些时候我们还是会遇到这个需求.比如,我们开发了一个播放器,用openGL进行video render,此时直接截 ...

  4. 20165212 学习基础和C语言基础调查

    学习基础与C语言基础调查 阅读文章的心得体会 五篇文章都从不同角度阐述了毅力的重要性,打字.减肥.运动各方面,比如“每天一万步”这个任务,人们通过建群聊互相监督.“打卡”的方式来实现坚持的目的,我认为 ...

  5. 在linux修改文件夹及其子文件夹的权限。

    加入-R 参数,就可以将读写权限传递给子文件夹例如chmod -R 777 /home/mypackage那么mypackage 文件夹和它下面的所有子文件夹的属性都变成了777.777是读.写.执行 ...

  6. oracle的时间

    今天发现之前从oracle导出的数据时间格式很奇怪: "ACTIVETIME","ACTIVITYID" "2018-08-10 06:08:43&q ...

  7. OPCDAAuto.dll 的一个坑

    最近项目需要对SCADA系统的下位机采集实时数据,常见做法是两种,一种采用ModBus RTU/TCP协议直接通过支持ModBus的下位机通信,一种是通过OPC规范,使用厂商提供的OPC Server ...

  8. composer包php-amqplib

    php-amqplib官方文档 url:http://www.rabbitmq.com/tutorials/tutorial-one-php.html #测试demo: url: http://**. ...

  9. Jenkins的项目管理

    新建Item 使用Jenkins最重要的是能够创建一些工作流,除了部署,还能做很多流程上的事情.同样,一条条项目建起来需要做一定的管理,在Jenkins首页Jenkins->新建可以按自己的需要 ...

  10. Java 成员变量和局部变量

    1.成员变量 在类中定义,用来描述对象将要有什么. 2.局部变量 在类的方法中定义,在方法中临时保存数据. 成员变量和局部变量的区别 作用域不同: 局部变量的作用域仅限于定义它的方法 成员变量的作用域 ...