0、前言

  过滤器、监听器、拦截器在实际开发中经常需要用到,下面我们来介绍一下spring boot中如何使用;

一、------ 过滤器 -----

1、作用:

  过滤器是客户端与服务器资源文件之间的一道过滤网,可以帮助我们过滤一些不符合要求的请求、可以对服务器的资源请求(如图片、文件等)进行拦截以实现一些特殊功能以及给予特殊响应;

  常用作session校验、判断用户权限、过滤敏感词汇、压缩响应信息、控制URL级别访问权限等

2、实现:

  使用过滤器很简单,只需要实现Filter类,重写他的三个方法即可:

init:过滤器创建时执行的方法;
destroy:过滤器销毁时执行的方法

doFilter:主方法,处理逻辑;里面有三个参数,可以通过他们获得请求的相关信息;


1)创建过滤器类 LogFilter,添加@WebFilter注解

package com.anson.common.filter;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;
import java.io.IOException; /**
* @description: 过滤器
* @author: anson
* @Date: 2019/12/20 6:03
*/ @WebFilter(filterName = "logfilter1", urlPatterns = "/*")
public class LogFilter implements Filter
{
private static final Logger logger = LoggerFactory.getLogger(LogFilter.class); @Override
public void init(FilterConfig filterConfig) throws ServletException
{ logger.info("----------------------->过滤器被创建");
} @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponseWrapper resp = new HttpServletResponseWrapper((HttpServletResponse) servletResponse); String requestURI = req.getRequestURI();
logger.info("--------------------->过滤器:请求地址"+requestURI); //记录请求
if(requestURI.contains("info")){
// servletRequest.getRequestDispatcher("/failed").forward(servletRequest, servletResponse);
resp.sendRedirect("/failed");
}else{
filterChain.doFilter(servletRequest, servletResponse);
}
} @Override
public void destroy() { logger.info("----------------------->过滤器被销毁");
}
}

2)在启动类上加入@ServletComponentScan注解

@ServletComponentScan("com.anson.common") //用于支持过滤器、监听器注解

即可

注意:我们以上采用的注解自动注册的方式,过滤器还可以采用代码注册的方式(略),自己选用一种即可;

二、----- 监听器 -----

1、作用:

  监听器用于监听web应用对象的创建、销毁、增加、修改、删除等动作的发生,并做出相应的响应处理;

  常用于统计在线人数、访问量、系统加载时信息初始化;

2、分类:

ServletContextListener:对应application,用于监听ServletContex属性的操作;
HttpSessionListener: 对应session,用于监听session对象,常用于统计在线情况;
ServletRequestListener:对应request,监听request对象的属性操作;

3、实现:

1}创建监听器 OnlineSessionListener

package com.anson.common.listener;

import com.anson.common.exception.GlobalExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
//import javax.servlet.ServletRequestListener;
import javax.servlet.annotation.WebListener;
//import javax.servlet.http.HttpSessionEvent;
//import javax.servlet.http.HttpSessionListener; /**
* @description: TODO
* @author: anson
* @Date: 2019/12/20 6:48
*/
@WebListener
public class OnlineSessionListener implements ServletContextListener //HttpSessionListener
{
private static final Logger logger = LoggerFactory.getLogger(OnlineSessionListener.class); @Override
public void contextInitialized(ServletContextEvent servletContextEvent)
{
logger.info("系统启动了");
System.out.println("系统启动了");
} @Override
public void contextDestroyed(ServletContextEvent servletContextEvent)
{
logger.info("系统停止了");
System.out.println("系统停止了");
} //=============================
// public static int online=0;
//
// @Override
// public void sessionCreated(HttpSessionEvent httpSessionEvent)
// {
//
// online ++;
// logger.info("有用户上线了,当前在线人数:" + online);
// System.out.println("有用户上线了,当前在线人数:" + online);
// }
//
// @Override
// public void sessionDestroyed(HttpSessionEvent httpSessionEvent)
// {
// online --;
// logger.info("有用户下线了,当前在线人数:" + online);
// System.out.println("有用户下线了,当前在线人数:" + online);
// }
}

2)在启动类上加入@ServletComponentScan注解

@ServletComponentScan("com.anson.common") //用于支持过滤器、监听器注解

即可

注意:我们以上采用的注解自动注册的方式,过滤器还可以采用代码注册的方式(略),自己选用一种即可;

三、 ------ 拦截器 ------

1、作用:

  拦截器是动态拦截action调用的对象,使得可以在action前后增加一些操作,也可以在action执行前停止操作;

  常用于登录认证、记录操作日志、通用处理等;

2、实现:

  使用过滤器很简单,只需要实现HandlerInterceptor类,重写他的三个方法即可:

preHandle:处理请求之前被调用;
postHandle:请求执行完后调用;
afterCompletion:在dispatcharservlet完全处理请求后调用,常用于记录耗时时间,也可用于进行一些资源处理操作;

1)编写拦截器类MyInterceptor
package com.anson.common.interceptor;

import com.anson.common.exception.GlobalExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* @description: 拦截器
* @author: anson
* @Date: 2019/12/20 7:23
*/ @Component
public class MyInterceptor implements HandlerInterceptor
{
private static final Logger logger = LoggerFactory.getLogger(MyInterceptor.class); public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception
{
logger.info("afterCompletion被调用");
long startime = (Long) arg0.getAttribute("startime");
logger.info("请求耗时:"+ (System.currentTimeMillis() - startime));
} public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
throws Exception
{
logger.info("postHandle被调用");
} public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { logger.info("preHandle被调用");
request.setAttribute("startime",System.currentTimeMillis());
return true;
}
}

2)增加配置类AppConfigurer,注册拦截器

package com.anson.config;

import com.anson.common.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; /**
* @description: 配置类
* @author: anson
* @Date: 2019/12/20 7:35
*/
@Configuration
public class AppConfigurer implements WebMvcConfigurer
{
@Autowired
private MyInterceptor myInterceptor; //注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myInterceptor);
}
}

即可

四、后记

  过滤器、拦截器、监听器的简单用法就是这样,包括后面要讲的AOP,他们在有些功能上是交叉的,根据实际需要灵活选用即可;

小白的springboot之路(十三)、过滤器、监听器、拦截器的更多相关文章

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

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

  2. JavaWeb过滤器.监听器.拦截器-原理&区别-个人总结

    对比项 拦截器 过滤器 机制 反射机制 函数回调 是否依赖servlet容器 是 否 请求处理 只能对action请求起作用 几乎所有的请求起作用 对action处理 可以访问action上下文.值栈 ...

  3. JavaWeb过滤器.监听器.拦截器-原理&区别(转)

    1.拦截器是基于java的反射机制的,而过滤器是基于函数回调 2.过滤器依赖与servlet容器,而拦截器不依赖与servlet容器 3.拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...

  4. AOP,过滤器,监听器,拦截器【转载】

    面向切面编程(AOP是Aspect Oriented Program的首字母缩写) ,我们知道,面向对象的特点是继承.多态和封装.而封装就要求将功能分散到不同的对象中去,这在软件设计中往往称为职责分配 ...

  5. JavaWeb过滤器.监听器.拦截器-?原理&区别

    过滤器可以简单理解为“取你所想取”,忽视掉那些你不想要的东西:拦截器可以简单理解为“拒你所想拒”,关心你想要拒绝掉哪些东西,比如一个BBS论坛上拦截掉敏感词汇. 1.拦截器是基于java的反射机制,过 ...

  6. 过滤器 & 监听器 & 拦截器

    过滤器: https://blog.csdn.net/MissEel/article/details/79351231 https://blog.csdn.net/qq_32363305/articl ...

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

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

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

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

  9. 小白的springboot之路(一)、环境搭建、第一个实例

    小白的springboot之路(一).环境搭建.第一个实例 0- 前言 Spring boot + spring cloud + vue 的微服务架构技术栈,那简直是爽得不要不要的,怎么爽法,自行度娘 ...

随机推荐

  1. 解决Debina系统自动更新软件包的问题

    不知从何时开始,我的电脑每天开机连接上网络之后,不断的在下载数据,状态栏显示网速达到每秒1到2兆.开始我还不太在意,不过后来由于带宽全部被这种莫名其奥妙的下载占据了,我连网页都无否正常浏览了,所以我决 ...

  2. Linux的awk命令详解

    awkawk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,默认以空格为分隔符将每行切片,切开的部分再 ...

  3. 【Android - IPC】之Messenger简介

    参考资料: 1.<Android开发艺术探索>第二章2.4.3 2.[Messenger完全解析] 1.Messenger概述 Messenger,译为“信使”,是Android中一种基于 ...

  4. 2、Docker 基础安装和基础使用 一

    基础环境 本次环境使用Centos 7.x版本系统,最小化安装,系统基础优化配置请查看 Centos 7.x 系统基础优化 安装 使用命令:yum install docker-io -y [root ...

  5. 深入了解CSS中盒子模型

    CSS中盒子模型介绍 什么是盒子? 盒子是用来存储物品,我们可以将盒子理解为酒盒,酒盒有什么组成的呢? 有酒可以喝.有填充物保护酒防止酒被摔坏.纸盒子. 我们怎么理解CSS中的盒子呢,CSS中盒子有什 ...

  6. linux搭建ftp出错汇总

    重启vsftpd出现”500 OOPS: vsftpd: cannot open config file:restart” 2008-05-09 21:33 进到/etc/init.d/目录 输入: ...

  7. mysql客户端 navicat 本地导入sql文件出错

    以前遇到过这个问题,找了半天度娘没解决,然后就放弃了. 因为是自己 demo 的项目 所以就自己手动建表了. 现在实习了,去到公司下载下代码来,拿上sql 导入发现还是报错, 根本没法整,然后自己都不 ...

  8. JavaScript&&jQuery创建新节点和操作属性对比

    JavaScript创建新节点和操作属性 通过JavaScript原生接口创建节点,在处理上是非常复杂与繁琐的. <!DOCTYPE html> <html lang="e ...

  9. Python 报错集合

    1.django_error:HINT: Add or change a related_name argument to the definition for...报错, 详情见: https:// ...

  10. 为什么说 Java 中只有值传递?

    对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...