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. Amazon Lightsail部署LAMP应用程序之部署实验室基础架构

    一.在Lightsail中创建LAMP堆栈实例 1.在AWS管理控制台的"服务"下拉选项中单击"Lightsail". 2.在语言方面选择 "英语&q ...

  2. 封装Ajax和跨域

    目录 引言 封装ajax 案例:使用自封装ajax 案例:动态加载瀑布流 跨域 引言 对于Ajax现在相信大家已经不会陌生了,无论是原生的XMLHttpRequest方式发送还是通过jQuery框架中 ...

  3. linux-PAM

    PAM(Pluggable Authentication Modules)即可插拔式认证模块,一种用户级别的认证方式,它也是当前Linux服务器普遍使用的认证方式. PAM认证原理:参考资料来自htt ...

  4. 从零开始手写 spring ioc 框架,深入学习 spring 源码

    IoC Ioc 是一款 spring ioc 核心功能简化实现版本,便于学习和理解原理. 创作目的 使用 spring 很长时间,对于 spring 使用非常频繁,实际上对于源码一直没有静下心来学习过 ...

  5. scrapy的一个简单小项目

    使用scrapy抓取目标url下所有的课程名和价格,并将数据保存为json格式url=http://www.tanzhouedu.com/mall/course/initAllCourse 观察网页并 ...

  6. Android触摸反馈

    事件分发 当点击事件发生时,事件最先传递给Activity,Activity会首先将事件将被所属的Window进行处理,即调用 superDispatchTouchEvent() 方法.通过观察sup ...

  7. Android Activity生命周期及启动模式

    曾经搞过许多东西,再熟练的东西一段时间没有碰都会生疏或忘记.后来体会到写成文档记录下来的重要性,但有些word或ppt记录下来的东西随着时间流逝会丢失,或者不愿去看.或许保存成博客的形式,会是更好的选 ...

  8. DRF Django REST framework APIView(一)

    什么是REST? REST是一个标准,一种规范,遵循REST风格可以使开发的接口通用,便于调用者理解接口的作用. 使url更容易理解,让增删改清晰易懂,在前后端分离开发中按照这一规范能加快开发效率,减 ...

  9. 云享专家倪升武:微服务架构盛行的时代,你需要了解点 Spring Boot

    [摘要] 微服务架构的本质在于分布式.去中心化. 随着互联网的高速发展,庞大的用户群体和快速的需求变化已经成为了传统架构的痛点. 在这种情况下,如何从系统架构的角度出发,构建出灵活.易扩展的系统来快速 ...

  10. 深入比特币原理(四)——锁定脚本(locking script)与解锁脚本(unlocking script)

    通常比特币都是以虚拟货币的概念出现在大众眼前,实际上比特币是第一个真正的区块链"平台",利用它去中心化.不可篡改.可追溯等特点不光可以实现多种交易模式(如点对点交易.多重签名交易等 ...