当前位置: 首页 > news >正文

湖北手机版建站系统信息计算机软件公司排名

湖北手机版建站系统信息,计算机软件公司排名,装潢设计是干嘛的,成都网站建设方案外包过滤器和拦截器有什么区别? 运行顺序不同:过滤器是在 Servlet 容器接收到请求之后,但在 Servlet被调用之前运行的;而拦截器则是在Servlet 被调用之后,但在响应被发送到客户端之前运行的。 过滤器Filter 依赖于 Servle…

过滤器和拦截器有什么区别?

  • 运行顺序不同:过滤器是在 Servlet 容器接收到请求之后,但在 Servlet被调用之前运行的;而拦截器则是在Servlet 被调用之后,但在响应被发送到客户端之前运行的。

image-20230828220547278

  • 过滤器Filter 依赖于 Servlet 容器,属于Servlet规范的一部分,可以在web.xml中进行配置或者使用注解(如@WebFilter)进行配置;而 拦截器Interceptor 不依赖于 Servlet 容器,一般可以在Spring配置文件中进行配置或使用注解(如@Interceptor)来配置拦截器;
  • Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行;
  • Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

知识扩展

过滤器的使用场景:

  • 身份验证:对请求进行身份验证,检查用户是否登录或具有访问权限。
  • 请求日志记录:记录请求的详细信息,如URL、参数、请求时间等。
  • 数据加工:对请求或响应的数据进行处理,例如压缩、解密、加密等。
  • 编码转换:对请求和响应的编码进行转换,以适应不同的字符编码要求。

简单的过滤器代码案例,用于记录请求的访问日志、请求时间记录:

新建LoggingFilter实现Filter类,获取request中的方法、URL,在过滤器链执行完成前后分别记录时间来获取请求处理时间

package com.springboot.learn.filter;import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;/*** <p>Class: LoggingFilter</p>* <p>Description: 日志Filter</p>** @author zhouyi* @version 1.0* @date 2023/8/28*/
public class LoggingFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化方法}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {long start = System.nanoTime();HttpServletRequest httpRequest = (HttpServletRequest) request;String requestURI = httpRequest.getRequestURI();String method = httpRequest.getMethod();System.out.println("Request received - Method: " + method + ", URI: " + requestURI + " ,useTime:" + (System.nanoTime() - start));// 继续执行请求链chain.doFilter(request, response);}@Overridepublic void destroy() {// 销毁方法}
}

在Servlet 中,我们需要在web.xml中配置过滤器,在SpringBoot中没有web.xml的概念,我们通过其他方式配置,如下

方式一:通过FilterRegistrationBean来配置

FilterRegistrationBean是Spring Boot提供的一个用于注册和配置过滤器的辅助类。它允许你以编程的方式定义过滤器,并将其注册到Servlet容器中。FilterRegistrationBean提供了一系列方法来配置过滤器的属性,包括过滤器实例、URL匹配模式、过滤器执行顺序、Dispatcher类型等。

通过使用FilterRegistrationBean,你可以更灵活地配置过滤器,并且不依赖于传统的基于web.xml配置的方式。你可以将FilterRegistrationBean作为一个Spring Bean进行管理,可以通过注入方式获取并设置过滤器的属性

@Configuration
public class FilterConfig {@Beanpublic FilterRegistrationBean registFilter() {FilterRegistrationBean registration = new FilterRegistrationBean();registration.setFilter(new LoggingFilter());registration.addUrlPatterns("/*");registration.setName("LoggingFilter");registration.setOrder(1);return registration;}
}

常见用法

  • setFilter(Filter filter):设置过滤器实例。
  • addUrlPatterns(String... urlPatterns):设置URL匹配模式,指定过滤器要拦截的URL路径模式。
  • setOrder(int order):设置过滤器的执行顺序,数字越小越先执行。
  • setDispatcherTypes(DispatcherType... dispatcherTypes):设置过滤器的Dispatcher类型,指定过滤器要拦截的请求类型,如REQUEST、FORWARD、INCLUDE、ASYNC等。
  • 其他方法还包括设置过滤器名称、初始化参数、是否启用异步支持等。

功能验证

@RestController
@RequestMapping("/test")
public class TestController {@GetMapping("/user")public String queryUser(String id) {return id;}
}

访问接口请求,发现控制台已打印出我们想要的信息。

image-20230829090935672

image-20230829091007295

方式二:通过@WebFilter注解实现

在过滤器中添加注解 @WebFilter进行配置,同样可以设置url匹配模式,过滤器名称等。

/*** <p>Class: LoggingFilter2</p>* <p>Description: 日志Filter</p>** @author zhouyi* @version 1.0* @date 2023/8/28*/
@WebFilter(urlPatterns = "/*", filterName = "LoggingFilter2")
public class LoggingFilter2 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化方法}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {long start = System.nanoTime();HttpServletRequest httpRequest = (HttpServletRequest) request;String requestURI = httpRequest.getRequestURI();String method = httpRequest.getMethod();System.out.println("【LoggingFilter2】Request received - Method: " + method + ", URI: " + requestURI + " ,useTime:" + (System.nanoTime() - start));// 继续执行请求链chain.doFilter(request, response);}@Overridepublic void destroy() {// 销毁方法}
}

注意,@WebFilter这个注解是Servlet3.0的规范,并不是Spring boot提供的。除了这个注解以外,我们还需在配置类中加另外一个注解:@ServletComponetScan,指定扫描的包,放在启动类上面。
在这里插入图片描述

访问请求,发现过滤器的两种配置方式均已实现

image-20230829093337412

拦截器的使用场景:

  • 权限检查:在请求处理方法执行之前,检查用户是否具有执行该操作的权限。
  • 日志记录:记录请求的详细信息、处理时间等,用于跟踪和监控。
  • 数据转换:在请求处理方法执行前后,对请求或响应的数据进行转换和处理。
  • 异常处理:捕获请求处理方法中抛出的异常,并进行相应的处理和响应。

在SpringBoot中实现拦截器有两种方式

(1)实现HandlerInterceptor接口,并实现相应的方法

(2)继承HandlerInterceptorAdapter类,并重写里面的方法

方式一:实现HandlerInterceptor接口

public class LoggingInterceptor implements HandlerInterceptor {long start = System.nanoTime();@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在请求处理方法执行之前的预处理逻辑start = System.nanoTime();// 返回 true 表示继续执行后续的拦截器和请求处理方法,返回 false 表示终止执行return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理方法执行之后的后处理逻辑HttpServletRequest httpRequest = (HttpServletRequest) request;String requestURI = httpRequest.getRequestURI();String method = httpRequest.getMethod();System.out.println("【HandlerInterceptor】Request received - Method: " + method + ", URI: " + requestURI + " ,useTime:" + (System.nanoTime() - start));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在视图渲染完成后的清理逻辑}
}

配置拦截器

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 可添加多个,/**是对所有的请求都做拦截registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "/register");}
}

运行时发现拦截器也生效

image-20230829131735838

image-20230829132120906

方式二:继承HandlerInterceptorAdapter

public class LoggingInterceptor2 extends HandlerInterceptorAdapter {long start = System.nanoTime();@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 在请求处理方法执行之前的预处理逻辑start = System.nanoTime();// 返回 true 表示继续执行后续的拦截器和请求处理方法,返回 false 表示终止执行return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {// 在请求处理方法执行之后的后处理逻辑HttpServletRequest httpRequest = (HttpServletRequest) request;String requestURI = httpRequest.getRequestURI();String method = httpRequest.getMethod();System.out.println("【LoggingInterceptor2】Request received - Method: " + method + ", URI: " + requestURI + " ,useTime:" + (System.nanoTime() - start));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {// 在视图渲染完成后的清理逻辑}
}

通过继承HandlerInterceptorAdapter类来实现拦截器的方式,也需要配置拦截器。和方式一的配置是一样的

@Configuration
public class WebAppConfigurer implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {// 可添加多个,/**是对所有的请求都做拦截registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "/register");registry.addInterceptor(new LoggingInterceptor2()).addPathPatterns("/**").excludePathPatterns("/login", "/register");}
}

运行时发现,两种方式的拦截器均已实现。
在这里插入图片描述
image-20230829133146147

http://www.yayakq.cn/news/854402/

相关文章:

  • html5 社团网站模板 代码下载优的深圳网站设计公司
  • 百度做网站要多久做PS的赚钱的网站
  • 网站购买空间网站后台怎么修改前台的某个超链接网址
  • 用wordpress做外贸网站长春网站搭建
  • 松江建设网站企业咨询顾问
  • h5四合一网站建设免费建立网站的有哪里
  • 手机网站制作解决方案网站存在风险什么意思
  • 在上阿里云做网站邵东平台网站建设
  • 网站按关键词显示广告图片wordpress图片水印
  • 自动全屏网站模板公司网站后台密码
  • 目前做美术的网站以及app网站的站点建设
  • 南昌专门做网站的人做网站需要的公司
  • 做网站ps能用美图秀秀么电子商务网络营销方式
  • js网站源码下载wordpress数字交易
  • 微信公众号 网站开发 2016百度云如何建设网站
  • 网站备案流程多少钱武陟住房和城乡建设局网站
  • 凡客网能直接做网站婚恋网站制作要多少钱
  • 长沙门户网站有哪些豫港大厦 做网站
  • 厦门专业的网站建设杭州高端网站制作
  • 响应式视频网站物联网app开发平台
  • 哈尔滨网站建设哪家有电子商城网站建设价格
  • 网站内容相同算侵权吗企业网站建设一条龙服务内容
  • 淘宝店有给网站做优化amwordpress更改主机
  • 多站点网站群的建设与管理系统室内设计网站排行榜前十名有哪些
  • 企业网站建设的技术指标和经济指标茂名网站建设价格
  • 广州网站优化排名系统wordpress主题添加字体设置
  • 清新大气企业公司网站源码点点 网站建设
  • 网站常用代码o2o网站做推广公司
  • 沈阳网站设计定制软件开发和网站建设的区别
  • 做铁艺需要什么网站深圳网页制作推广公司排名