v博客前言

在做web开发的时候,过滤器(Filter)拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西;拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇。

过滤器依赖于servlet容器,是JavaEE标准,是在请求进入容器之后,还未进入Servlet之前进行预处理,并且在请求结束返回给前端这之间进行后期处理。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等

java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。

v过滤器demo

1.1 创建MyTestFilter

  1. package com.demo.Filter;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.springframework.context.annotation.Configuration;
  5. import org.springframework.stereotype.Component;
  6.  
  7. import javax.servlet.*;
  8. import javax.servlet.annotation.WebFilter;
  9. import java.io.IOException;
  10.  
  11. /**
  12. * Created by toutou on 2018/10/27.
  13. */
  14. @Slf4j
  15. @Component
    public class MyTestFilter implements Filter{
  16.  
  17. @Override
  18. public void init(FilterConfig filterConfig) throws ServletException {
  19. System.out.println("1111111111111111111111111");
  20. log.info("filter 初始化");
  21. }
  22.  
  23. @Override
  24. public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
  25. throws IOException, ServletException {
  26. // TODO Auto-generated method stub
  27. System.out.println("2222222222222222222222222");
  28. log.info("doFilter 请求处理");
  29. //TODO 进行业务逻辑
  30.  
  31. //链路 直接传给下一个过滤器
  32. chain.doFilter(request, response);
  33. }
  34.  
  35. @Override
  36. public void destroy() {
  37. System.out.println("33333333333333333333333333");
  38. log.info("filter 销毁");
  39. }
  40. }

1.2 查看idea启动日志

1.3 启动tomcat,查看日志。

如果需要针对指定路径才让过滤器生效,可以参考WebConfig类。

v拦截器demo

2.1 MyTestInterceptor

  1. package com.demo.Filter;
  2.  
  3. import javax.servlet.http.HttpServletRequest;
  4. import javax.servlet.http.HttpServletResponse;
  5.  
  6. import org.springframework.stereotype.Component;
  7. import org.springframework.web.servlet.HandlerInterceptor;
  8. import org.springframework.web.servlet.ModelAndView;
  9.  
  10. /**
  11. * Created by toutou on 2018/10/27.
  12. */
  13. @Component
  14. public class MyTestInterceptor implements HandlerInterceptor {
  15. /*
  16. * 视图渲染之后的操作
  17. */
  18. @Override
  19. public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
  20. throws Exception {
  21.  
  22. }
  23.  
  24. /*
  25. * 处理请求完成后视图渲染之前的处理操作
  26. */
  27. @Override
  28. public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
  29. throws Exception {
  30.  
  31. }
  32.  
  33. /*
  34. * 进入controller层之前拦截请求
  35. */
  36. @Override
  37. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object obj) throws Exception {
  38. System.out.println("MyTestInterceptor 1111111111");
  39. return true;
  40. }
  41. }

2.2 WebConfig

  1. package com.demo.Filter;
  2.  
  3. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
  7. import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
  8.  
  9. import javax.annotation.Resource;
  10.  
  11. /**
  12. * Created by toutou on 2018/10/27.
  13. */
  14. @Configuration
  15. public class WebConfig implements WebMvcConfigurer {
  16. @Resource
  17. private MyTestInterceptor myTestInterceptor;
  18.  
  19. @Override
  20. public void addInterceptors(InterceptorRegistry registry) {
  21. // 自定义拦截器,添加拦截路径和排除拦截路径
  22. registry.addInterceptor(myTestInterceptor).addPathPatterns("/show");
  23. }
  24.  
  25. @Bean
  26. public FilterRegistrationBean testFilterRegistration(MyTestFilter myTestFilter) {
  27. FilterRegistrationBean registration = new FilterRegistrationBean();
  28. registration.setFilter(myTestFilter);//添加过滤器
  29. registration.addUrlPatterns("/show");//设置过滤路径,/*所有路径
  30. //registration.addInitParameter("name", "alue");//添加默认参数
  31. registration.setName("MyFilter");//设置优先级
  32. registration.setOrder(1);//设置优先级
  33. return registration;
  34. }
  35. }

运行效果:

v注意事项

注意设置启动类的扫描路径。

  1. package com.demo.hellospringboot;
  2.  
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.mybatis.spring.annotation.MapperScan;
  5. import org.springframework.boot.SpringApplication;
  6. import org.springframework.boot.autoconfigure.SpringBootApplication;
  7. import org.springframework.context.annotation.ComponentScan;
  8.  
  9. @SpringBootApplication
  10. @ComponentScan(basePackages = {"com.demo"})
  11. @MapperScan(basePackages = {"com.demo.dao"})
  12. @Slf4j
  13. public class HellospringbootApplication {
  14.  
  15. public static void main(String[] args) {
  16. SpringApplication.run(HellospringbootApplication.class, args);
  17. }
  18. }

SpringBoot(十一)过滤器和拦截器的更多相关文章

  1. springboot(五)过滤器和拦截器

    前言 过滤器和拦截器二者都是AOP编程思想的提现,都能实现诸如权限检查.日志记录等.二者有一定的相似之处,不同的地方在于: Filter是servlet规范,只能用在Web程序中,而拦截器是Sprin ...

  2. SpringBoot入门教程(十一)过滤器和拦截器

    在做web开发的时候,过滤器(Filter)和拦截器(Interceptor)很常见,通俗的讲,过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”,关心你 ...

  3. springboot使用过滤器和拦截器

    1.Filter过滤器 @Componentpublic class AuthFilter implements Filter { private static final Log log = Log ...

  4. springboot配置过滤器和拦截器

    import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Http ...

  5. 关于springboot中过滤器和拦截器

    在解决跨域问题中,发现拦截器和过滤器用得不是熟练.就参考了下一下两个作者的文档.希望大家也可以汲取精华 文档1   https://blog.csdn.net/moonpure/article/det ...

  6. springboot中过滤器、拦截器、切片使用

    直接贴代码:采用maven工程 pom.xml <?xml version="1.0" encoding="UTF-8"?> <project ...

  7. springBoot之配置文件的读取以及过滤器和拦截器的使用

    前言 在之前的学习springBoot中,成功的实现了Restful风格的基本服务.但是想将之前的工程作为一个项目来说,那些是仅仅不够的.可能还需要获取自定义的配置以及添加过滤器和拦截器.至于为什么将 ...

  8. springboot配置监听器、过滤器和拦截器

    监听器:listener是servlet规范中定义的一种特殊类.用于监听servletContext.HttpSession和servletRequest等域对象的创建和销毁事件.监听域对象的属性发生 ...

  9. springboot环境下配置过滤器和拦截器

    以前我们在配置过滤器和拦截器的时候,都是一个类继承一个接口,然后在xml中配置一下就ok 但是,但是,这是springboot的环境,没有xml的配置.所以我们还要继续学习啊啊啊啊啊~~~~~ 先简单 ...

随机推荐

  1. 对datetime日期类型进行序列化的处理

    datetime类型序列化 在工作中遇到从数据库中取出来一个datetime类型的数据,在对其进行序列化的过程中,报错python datetime.datetime is not JSON  ser ...

  2. Java中同步的几种实现方式

    1.使用synchronized关键字修饰类或者代码块: 2.使用Volatile关键字修饰变量: 3.在类中加入重入锁. 代码示例: 非同步状态下: public static void main( ...

  3. 在虚拟机中安装ubuntu

    初始安装: 1.安装新虚拟机时,选择稍后安装操作系统,这可以自己设置语言等信息 2.修改自定义硬件:为网卡生成一个mac地址,(这里需要注意,有时网卡会冲突,导致连接时好时坏,以后可以删除掉网卡,重新 ...

  4. Unity3D的断点调试功能

    断点调试功能可谓是程序员必备的功能了.Unity3D支持编写js和c#脚本,但很多人可能不知道,其实Unity3D也能对程序进行断点调 试的.不过这个断点调试功能只限于使用Unity3D自带的Mono ...

  5. ELK学习博客

    ELK实时日志分析平台环境部署--完整记录 https://www.cnblogs.com/kevingrace/p/5919021.html

  6. java.net.BindException: 地址已在使用 (Bind failed)

    java.net.BindException: 地址已在使用,是因为端口被占用,出现在启动服务的时候 报错如截图 报错显示 10062端口被占用冲突 执行netstat -alnp | grep 10 ...

  7. Call to undefined function think\finfo_open() 报错 解决方法

    Call to undefined function think\finfo_open() 经过各方面排查,是fileinfo扩展没有安装 安装即可

  8. windows7下搭建robot framework环境指导

    第一步 安装Python并设置环境变量 1.安装python: python下载地址https://www.python.org/,建议用2.7.x版本 2.设置环境变量: 方法如下所示 第二步 安装 ...

  9. python学习笔记_week19

    note 上节内容回顾: 1.Django请求生命周期 -> URL对应关系(匹配) -> 视图函数 -> 返回用户字符串 -> URL对应关系(匹配) -> 视图函数 ...

  10. Your password has expired. To log in you must change it using a client that supports expired passwords.

    [Lk] ERROR [11-26 23:01:51] [main] net.jweb.listener.AppInitializerListener.contextInitialized(231) ...