监听器:listener是servlet规范中定义的一种特殊类。用于监听servletContext、HttpSession和servletRequest等域对象的创建和销毁事件。监听域对象的属性发生修改的事件。用于在事件发生前、发生后做一些必要的处理。其主要可用于以下方面:1、统计在线人数和在线用户2、系统启动时加载初始化信息3、统计网站访问量4、记录用户访问路径。

  过滤器:Filter是Servlet技术中最实用的技术,Web开发人员通过Filter技术,对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。它主要用于对用户请求进行预处理,也可以对HttpServletResponse进行后处理。使用Filter的完整流程:Filter对用户请求进行预处理,接着将请求交给Servlet进行处理并生成响应,最后Filter再对服务器响应进行后处理。

  拦截器:Interceptor 在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。比如日志,安全等。一般拦截器方法都是通过动态代理的方式实现。可以通过它来进行权限验证,或者判断用户是否登陆,或者是像12306 判断当前时间是否是购票时间。

  三大器在springboot中使用时,首先实现相应的接口定义类,然后通过配置类将其加入到spring容器中,从而实现相应的功能。代码如下:

1、过滤器类

package com.example.demo;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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;public class MyFilter implements Filter {  @Override  public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {  System.out.println(servletRequest.getParameter("name"));HttpServletRequest hrequest = (HttpServletRequest)servletRequest;HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper((HttpServletResponse) servletResponse);if(hrequest.getRequestURI().indexOf("/index") != -1 || hrequest.getRequestURI().indexOf("/asd") != -1 ||hrequest.getRequestURI().indexOf("/online") != -1 ||hrequest.getRequestURI().indexOf("/login") != -1) {filterChain.doFilter(servletRequest, servletResponse);  }else {wrapper.sendRedirect("/login");}}  @Override  public void destroy() {  }@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}
}  

2、监听器类

package com.example.demo;import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;public class MyHttpSessionListener implements HttpSessionListener {public static int online = 0;@Overridepublic void sessionCreated(HttpSessionEvent se) {System.out.println("创建session");online ++;}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {System.out.println("销毁session");}}

3、拦截器类

package com.example.demo;import java.io.PrintWriter;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.HandlerMapping;
import org.springframework.web.servlet.ModelAndView;public class MyInterceptor implements HandlerInterceptor {//在请求处理之前进行调用(Controller方法调用之前
    @Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {System.out.println("preHandle被调用");Map map =(Map)httpServletRequest.getAttribute(HandlerMapping.URI_TEMPLATE_VARIABLES_ATTRIBUTE);System.out.println(map.get("name"));System.out.println(httpServletRequest.getParameter("username"));if(map.get("name").equals("zhangsan")) {return true;    //如果false,停止流程,api被拦截}else {PrintWriter printWriter = httpServletResponse.getWriter();    printWriter.write("please login again!");    return false; }}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandle被调用");}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion被调用");}
}

4、配置类

package com.example.demo;import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Configuration
public class MywebConfig implements WebMvcConfigurer {@Overridepublic void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/zxc/foo").setViewName("foo");}@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/asd/**"); }@SuppressWarnings({ "rawtypes", "unchecked" })@Beanpublic FilterRegistrationBean filterRegist() {FilterRegistrationBean frBean = new FilterRegistrationBean();frBean.setFilter(new MyFilter());frBean.addUrlPatterns("/*");System.out.println("filter");return frBean;}@SuppressWarnings({ "rawtypes", "unchecked" })@Beanpublic ServletListenerRegistrationBean listenerRegist() {ServletListenerRegistrationBean srb = new ServletListenerRegistrationBean();srb.setListener(new MyHttpSessionListener());System.out.println("listener");return srb;}
}

5、控制层

package com.example.demo;import java.util.Date;
import java.util.Map;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class UserController {private final Logger logger = LoggerFactory.getLogger(UserController.class);@Value("${application.message:Hello World}")private String message ;@GetMapping("/asd/{name}")public String welcome(@PathVariable String name,Map<String, Object> model) {model.put("time", new Date());model.put("message", this.message);return "welcome";}@RequestMapping("/login")@ResponseBodypublic Object foo() {logger.info("打印日志----------------------");return  "login";}@RequestMapping("/index")@ResponseBodypublic Object index(HttpServletRequest request) {HttpSession  session = request.getSession(true);session.setAttribute("zxc", "zxc");return  "index";}@RequestMapping("/online")@ResponseBodypublic Object online() {return  "当前在线人数:" + MyHttpSessionListener.online + "人";}
}

6、程序主入口及application.properties文件默认。

  项目启动后,首先测试过滤器,所有访问路径都需经过我们自定义的filter,如果路径中包含/index、/asd、/online、/login则直接通过,否则则被重定向至/login。

然后测试监听器,先访问http://localhost:8080/index,创建session对象(因为 session对象创建需要显示的调用getsession方法),然后访问http://localhost:8080/online,然后换一个浏览器做相同操作,如下:

最后测试拦截器,代码展示了如何获取@PathVariable注解的请求参数以及普通请求参数,首先访问http://localhost:8080/asd/zhangsan?username=lisi,响应正常,如果访问路径上的名字不是zhangsan,则被拦截,例如http://localhost:8080/asd/wangwu?username=lisi,如下:

  在实际项目中我们还可以在配置的时候设置过滤器、拦截器的执行顺序及其它的参数,同时filter和listener还有对应的注解方式:@WebFilter和@WebListener,在使用注解方式时不要忘了在主程序加上@ServletComponentScan注解,这样才能在程序启动时将对应的bean加载进来。

转载于:https://www.cnblogs.com/hhhshct/p/8808115.html

springboot配置监听器、过滤器和拦截器相关推荐

  1. springboot中的过滤器、拦截器、监听器整合使用

    文章目录 controller层 过滤器 拦截器 拦截器介绍 使用拦截器 监听器 监听器介绍 使用监听器 修改启动类 controller层 用于测试 @RestController public c ...

  2. springboot二:过滤器、拦截器、静态资源访问

    一:springboot中的过滤器 过滤器是什么? 它是基于Servlet 技术实现的, 简单的来说,过滤器就是起到过滤的作用,在web项目开发中帮我们过滤一些指定的 url做一些特殊的 处理. 过滤 ...

  3. springBoot之过滤器和拦截器的使用

    在springBoot中,过滤器和拦截器的使用. 过滤器 概述 过滤器是什么? 简单的来说,过滤器就是过滤的作用,在web开发中过滤一些我们指定的url. 过滤器主要做什么? 过滤掉一些不需要的东西, ...

  4. 监听器——Listener(简述、自定义监听器) 略,过滤器与拦截器

    文章目录 监听器 自定义监听器 过滤器与拦截器 监听器 略,不怎么使用了. 见名知意,比如你上课玩手机,亲爱的班主任静悄悄地出现在你身后.你就是"被监听的对象",班主任就" ...

  5. 一口气说出 过滤器 和 拦截器 6个区别,别再傻傻分不清了

    周末有个小伙伴加我微信,向我请教了一个问题:老哥,「过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊?」 听到题目我的第一感觉就是:「简单」! 毕竟这两种工具开发中用到的频 ...

  6. spring 两次进入拦截器_过滤器和拦截器的 6 个区别,别再傻傻分不清了

    点击上方 肉眼品世界,选择 设为星标 深度价值体系传递 作者 :程序员内点事 来源 :toutiao.com/i6834310440495874563 毕竟这两种工具开发中用到的频率都相当高,应用起来 ...

  7. tomcat 拦截指定url_一口气说出 过滤器 和 拦截器 6个区别,别再傻傻分不清了

    点击" 程序员内点事 "关注,选择" 设置星标 " 坚持学习,好文每日送达! 周末有个小伙伴加我微信,向我请教了一个问题:老哥,「过滤器 (Filter) 和 ...

  8. 过滤器 和 拦截器 6个区别,别再傻傻分不清了

    周末有个小伙伴加我微信,向我请教了一个问题:老哥,过滤器 (Filter) 和 拦截器 (Interceptor) 有啥区别啊? 听到题目我的第一感觉就是:简单! 毕竟这两种工具开发中用到的频率都相当 ...

  9. ​​​​​​过滤器和拦截器详解

    过滤器 和 拦截器的 6个区别,别再傻傻分不清了_程序员小富的博客-CSDN博客_过滤器和拦截器 若依登陆过程及过滤器拦截器的使用: 用户登陆接口:1.把用户信息通过uuid即token作为key,存 ...

最新文章

  1. 互联网大脑的发育与元宇宙的兴起
  2. Linux使用dd命令快速生成大文件
  3. Grunt-cli的执行过程以及Grunt加载原理
  4. 2018.3.24 struct
  5. linux mysql5.6 安装
  6. Java中String的next()和nextLine()方法
  7. .NET MVC 遇到的小问题
  8. SpringBoot开发流程
  9. 正式版的Linux Kernel 5.1来了,非LTS
  10. Redundant declaration: @SpringBootApplication already applies given @ComponentScan
  11. Flink Data Types Serialization
  12. 【python学习笔记】爬虫总遇到的:'latin-1' codec can't encode character...
  13. UVA 11584 Partitioning by Palindromes
  14. 零基础转行大数据怎么学习?大数据学习路线
  15. 计算矩阵行列式时奇排列与偶排列的判定
  16. Java识别获取pdf中文字信息(此方法任意pdf的信息都可以拿到)
  17. Echarts 柱状图调整 y 轴单位标题与图表之间的距离
  18. 10-11月数据接口-京东商品信息api,金碟Api对接,京东商智监控商品request采集后指数还原,聚水潭第三方接入api,拼多多上架辅助非第三方SKU核对上传,拼多多销量无限修改更新
  19. 网络图片加载缓慢问题解决方案
  20. 小程序开发之微信接入微信调用wenxin4j

热门文章

  1. 将您的SQL Server工作负载迁移到PostgreSQL –第1部分
  2. 活在贫困线之下的开源软件项目——开源的可持续性斗争
  3. 新版 Windows 10 最佳功能预览,五月即将更新
  4. 电大计算机应用基础网考小抄,电大计算机应用基础网考资料小抄.doc
  5. java删除mysql 数据库语句怎么写_怎么用JAVA语句在Mysql中查询,添加,删除语句,说的详细点,谢谢!...
  6. tp5分页不加载搜索参数
  7. 在iView中动态创建表格
  8. Jdk并发线程处理CountDownLatch、CyclicBarrier、Semaphore
  9. mysql分组查询学生平均年龄_mysql练习题
  10. python下载url链接_使用Python从url地址下载所有pdf文件