Spring三大器

news/2024/12/22 20:37:57/

Spring三大器

监听器listener

Servlet的监听器Listener,它主要作用是随着web应用的启动而启动,只初始化一次,随着web的停止而销毁。

主要工作是:进行一些初始化的工作,例如参数或者固定一些固定对象

  • Spring boot框架自带的Listener由框架提供,在Application的run方法中进行初始化并完成加载

  • 自己实现的监听器可完成各种功能,在Spring boot下,可以实现各种特殊的监听器接口来实现各种动作的监听。同时可以通过使用注解@WebListener来完成Listener的初始化工作让其注入到IoC容器,记得在Application启动类上加上注解@ServletComponentScan。

@WebListener
public class SocketCounter implements HttpSessionListener {@Overridepublic void sessionCreated(HttpSessionEvent se) {}@Overridepublic void sessionDestroyed(HttpSessionEvent se) {}
}
@ServletComponentScan
@SpringBootApplication(scanBasePackages = "com.example.socketdemo", exclude = {DataSourceAutoConfiguration.class})
public class SocketdemoApplication {public static void main(String[] args) {SpringApplication.run(SocketdemoApplication.class, args);}
}

拦截器Interceptor

Interceptor的urlPattern针对的是SpringMVC中的Controller控制器处理的请求

Interceptor是SpringMVC的一个机制,在Spring框架的程序中,优先使用拦截器

过滤器和拦截器的功能类似 :用于请求调用真正的业务逻辑之前和之后做一些通用性的处理,例如日志打印,或者请求过滤等

Interceptor 的执行顺序大致为:

  • 请求到达 DispatcherServlet

  • DispatcherServlet 发送至 Interceptor ,执行 preHandle

  • 请求达到 Controller

  • 请求结束后,postHandle 执行

Spring boot框架下主要通过实现HandlerInterceptor接口来实现请求的拦截,该接口有3个主要方法

  • preHandler() 在handler执行之前,返回boolean,true表示继续执行,false表示拦截

  • postHandler() 在handler执行之后,可以在结果返回之前对结果进行修改

  • afterCompetition() 在请求完全结束调用之后,用爱统计请求耗时等等

使用拦截器进行方法执行时间统计

@Slf4j
@Component
public class ExecuteTimeInterceptor extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {long startTime = System.currentTimeMillis();request.setAttribute("startTime", startTime);System.out.println("in pre handle");// 拦截器放行return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 获取到请求的开始时间System.out.println("in post handle");long startTime = (Long) request.getAttribute("startTime");long endTime = System.currentTimeMillis();long executeTime = endTime - startTime;//modified the exisitng modelAndViewSystem.out.println(String.format("execute time is %s",executeTime));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {super.afterCompletion(request, response, handler, ex);}
}

编写config类,将对应的拦截器链注入到容器中。

@Configuration
public class MyWebConfig implements WebMvcConfigurer {// 配置拦截器// 将拦截器添加到 registry当中// 配置拦截需要拦截的请求路径 /** 全匹配@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new ExecuteTimeInterceptor()).addPathPatterns("/**");}
}

过滤器Filter

Filter的urlPattern针对的是所有请求,在Servlet 前后起作用。

Filter由java实现,它依赖于Servlet容器。

一般情况下 Filter是一个链

  • request -> filter1 -> filter2 ->filter3 -> …. -> request resource.

  • chain.doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源

@WebFilter(filterName = "AuthFilter",urlPatterns = "/*")
public class AuthFilter implements Filter {List<String> excludedUrlList;String excludedUrls = "/login";@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("excludedUrls:" + excludedUrls);excludedUrlList = Arrays.asList(StringUtils.split(excludedUrls, ","));System.out.println("AuthFilter init success");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;HttpServletResponse response = (HttpServletResponse) servletResponse;// 校验是否需要登录System.out.println("url is " + ((HttpServletRequest) servletRequest).getRequestURL());Boolean result = excludedUrlList.contains(((HttpServletRequest) servletRequest).getRequestURI());System.out.println("是否需要重定向到login " + !result);if (!result) {System.out.println("this request need to go to 重定向页面");response.sendRedirect("/login");return;}filterChain.doFilter(servletRequest, servletResponse);}@Overridepublic void destroy() {}private Boolean needLogin(HttpServletRequest request) {System.out.println("in needLogin()");return true;}
}

Spring Boot中使用自定的Filter:

  1. 实现Filter接口,并重载其核心的三个方法。

  2. 使用注解 @WebFilter(filterName = "AuthFilter",urlPatterns = "/*") 将Filter完成注入,并配置好需要过滤的路径

拦截器和过滤器的区别

  • 在Spring框架下,尽量使用Interceptor,因为过滤器能做的事拦截器基本都能做
  • Interceptor能够操作上下文等Spring框架的容器中一些对象,而Filter不可以
  • Filter基于针对Servlet的所有请求,而Interceptor只针对Controller的请求进行处理

转载于:https://www.cnblogs.com/aguai1992/p/10914477.html


http://www.ppmy.cn/news/450677.html

相关文章

四大器

四大器 目录 一、迭代器 1.迭代协议2.一个简单的迭代器&#xff1a;3.迭代异常处理&#xff08;迭代完了&#xff0c;没有了,try&#xff09;二、生成器 yield与return的区别&#xff1a;三、装饰器 1.无参模板&#xff08;二层&#xff09;2.有参模板&#xff08;三层&#xf…

python三大,Python三大器

迭代器、天生器、装饰器 一、装饰器 1、函数工具&#xff1a;可以把函数名(不带括号)当成变量去用&#xff0c;关联的值是该函数的内存地址 2、闭包函数作用域函数嵌套函数工具 焦点点&#xff1a;内部函数传参的关系查找是以界说阶段为准 3、什么是闭包函数&#xff1f; 闭包是…

python三大器

迭代器 1.1、判断可迭代对象 from collections import Iterable # 判断对象是否是可迭代对象 result isinstance(X, Iterable) print("X是否是可迭代对象:", result) # >> X是否是可迭代对象: True1.2、自定义迭代器 自定义迭代器对象&#xff1a; 在类里面提…

python 三大器

python 三大器 迭代器: 有__iter__()和__next__()方法生成器&#xff1a;函数中将return换成yield装饰器&#xff1a;闭包的本质 迭代器 遇到问题没人解答&#xff1f;小编创建了一个Python学习交流QQ群&#xff1a;579817333 寻找有志同道合的小伙伴&#xff0c;互帮互助,群…

JAVA三大器介绍

1.过滤器&#xff08;Filter&#xff09;&#xff1a;所谓过滤器顾名思义是用来过滤的&#xff0c;Java的过滤器能够为我们提供系统级别的过滤&#xff0c;也就是说&#xff0c;能过滤所有的web请求&#xff0c; 这一点&#xff0c;是拦截器无法做到的。在Java Web中&#xff0…

【离散数学】gpt教我离散数学3

对于给定的A、B和f&#xff0c;判断f是否为从A到B的函数&#xff1a;f&#xff1a;A→B.如果是&#xff0c;说明f是否为单射、满射、双射的. ABR, f(x)根号x 对于给定的集合 A B R AB\mathbb{R} ABR 和函数 f : A → B f:A\rightarrow B f:A→B&#xff0c; f ( x ) x f(…

Java官方笔记9Lambda表达式

Lambda Expression 有了Lambda Expression&#xff0c;就不用再写anonymous classes。 写Lambda&#xff0c;首先要找到它的类型。 There is a restriction on the type of a lambda expression: it has to be a functional interface. 函数接口&#xff0c;只有1个抽象方法的接…

系统架构设计师笔记第18期:NoSQL数据库

NoSQL 数据库通常指非关系型数据库&#xff0c;是一种基于数据键值对存储、高度分布式、支持动态查询的数据管理系统。NoSQL 数据库的设计目的是为了解决传统关系型数据库无法处理的大型应用程序的数据存储和管理问题。它们通常具有以下特点&#xff1a; 灵活性&#xff1a;No…