过滤器和拦截器的区别

news/2024/10/3 19:24:25

一、拦截器和过滤器的区别

1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。


2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理的,spring的功能可以被拦截器使用,在拦截器里注入一个service,可以调用业务逻辑。而过滤器是JavaEE标准,只需依赖servlet api ,不需要依赖spring。


3、过滤器的实现基于回调函数。而拦截器(代理模式)的实现基于反射


4、Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。


5、Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理(反射)的方式来执行。


6、Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便。

过滤器的实现
注册filter

public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("MyFilter");}@Overridepublic void destroy() {Filter.super.destroy();}
}

实现filter

@Slf4j
@Order(1)
public class MyFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("-----------------------MyFilter");filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {Filter.super.destroy();}

使用@WebFilter注解

@WebFilter(filterName = "LoginFilter" ,urlPatterns = "/*")
@Slf4j
@Order(2)
public class LoginFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.info("进入过滤器init");Filter.super.init(filterConfig);}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {log.info("进入过滤器"+servletRequest.getRemoteAddr()+"|"+servletRequest.getRemoteHost()+"|"+servletRequest.getLocalPort()+"|"+servletRequest.getServerPort());filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {log.info("进入过滤器destroy");Filter.super.destroy();}

拦截器的实现
1、自定义拦截器

@Slf4j
public class AuthInterceptor implements HandlerInterceptor {@Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {log.info("preHandle");String clientIP = ServletUtil.getClientIP(httpServletRequest);log.info("访问IP:"+clientIP);log.info("请求路径:{}", httpServletRequest.getRequestURI());return true;}@Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {log.info("postHandle");}@Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {log.info("afterCompletion");}

2、注册拦截器

@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {private final AuthInterceptor authInterceptor;public WebMvcConfig(AuthInterceptor authInterceptor) {this.authInterceptor = authInterceptor;}@Overrideprotected void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(authInterceptor).addPathPatterns("/**");}
}

应用
过滤器:
1)过滤敏感词汇(防止sql注入)
2)设置字符编码
3)URL级别的权限访问控制
4)压缩响应信息

拦截器:
1.登录验证,判断用户是否登录。
2.权限验证,判断用户是否有权限访问资源,如校验token
3.日志记录,记录请求操作日志(用户ip,访问时间等),以便统计请求访问量。
4.处理cookie、本地化、国际化、主题等。
5.性能监控,监控请求处理时长等。
6.通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/44518.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

typora快捷键配置

typora高亮快捷键配置 (typora的高亮没有默认快捷键, 需要自己添加) 1.激活高亮功能 偏好设置 → markdown → markdown扩展语法 → 勾选高亮 2.添加快捷键 (原教程可参见官网) 首先可将typra的语言显示换成English, 方便后续定义: 偏好设置 → 通用 → 语言 每个软件, 理论上每…

Elasticsearch 系列(七)- 在ASP.NET Core中使用高级客户端NEST来操作Elasticsearch

本章将和大家分享在ASP.NET Core中如何使用高级客户端NEST来操作我们的Elasticsearch。本章将和大家分享在ASP.NET Core中如何使用高级客户端NEST来操作我们的Elasticsearch。 NEST是一个高级别的Elasticsearch .NET客户端,它仍然非常接近原始Elasticsearch API的映射。所有的…

Perfetto分析进阶

一、Perfetto介绍 Perfetto是Android Q中引入的全新下一代平台级跟踪工具,为Android、Linux和Chrome平台提供了一种通用的性能检测和跟踪分析工具集。其核心是引入了一种全新的用户空间到用户空间的跟踪协议,该协议基于protobuf序列化机制将抓取的数据填充到共享内存缓冲区,…

Kali中MSF利用永恒之蓝(复现)

Kali中MSF利用永恒之蓝(复现) 1、进入MSF框架:2、搜索MS17_010漏洞:这里找到了四个模块:0、1、4是漏洞利用模块;2、3是辅助模块,主要探测主机是否存在MS17_010漏洞。 3、利用Auxiliary辅助探测模块对漏洞进行探测(查看下所需要的参数):4、设置要探测的远程目标(两种…

B - Ticket Counter

B - Ticket Counter https://atcoder.jp/contests/abc358/tasks/abc358_b思路 第i个完成的时刻,done[i] 跟第i-1完成时间done[i-1]有关系, 第i个的开始时刻t[i] 大于 done[i-1], done[i] = t[i]+a第i个的开始时刻t[i] 不大于 done[i-1], done[i] = done[i-1]+aCode https…

使用Kimi+Markmap总结文件内容生成思维导图原创

一份文件内容太长,完整阅读下来太费时间,但如果使用AI进行内容提炼,再总结成思维导图,方便快速看到这份文件的核心内容和主题结构,就会极大地节约时间,目前就可以使用Kimi+Markmap这两个工具,帮我们把ppt、word、pdf等文件内容快速总结成思维导图。 一、工具准备 Kimi,…

vue状态共享--VUEX

一,VUEX是什么 Vue中跨组件状态管理模式+库 包含以下几个部分: 状态:State,驱动应用的数据源; 视图:Vue组件,以声明方式将状态映射到视图; 操作:Action,响应在视图上的用户输入导致的状态变化。