过滤器和拦截器的区别
2024-01-01 08:44:36
一、过滤器
1. 什么是过滤器?
过滤器是一种用于JavaWeb
应用程序中的组件,它可以拦截HTTP
请求和响应,以实现一些特定的功能。
过滤器可以对请求和响应进行修改,可以阻止请求进入Servlet
,也可以修改响应返回给客户端。
2. 过滤器的主要作用
- 登录验证:检查用户是否已经登录,如果没有登录则跳转到登录页面。
- 权限控制:检查用户是否有访问某个资源的权限,如果没有则提示错误信息或者跳转到其他页面。
- 编码转换:设置请求和响应的字符编码,解决中文乱码问题。
- 敏感词过滤:替换或者屏蔽掉请求参数或者响应内容中的敏感词汇。
- 日志记录:记录用户的访问信息,如
IP
地址,访问时间,访问路径等。
3. 过滤器的底层实现原理是基于回调函数的
当一个请求到达服务器时,服务器会根据请求的URL
匹配相应的过滤器链。过滤器链是由一个或多个过滤器组成的,按照配置的顺序依次执行。
每个过滤器都实现了Filter
接口,该接口定义了三个方法:
init(FilterConfig filterConfig)
:初始化方法,在过滤器创建时调用一次,可以用来获取过滤器配置参数。doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
:过滤方法,在每次请求被拦截时调用,可以用来执行具体的过滤逻辑。该方法有三个参数:request
表示请求对象,response
表示响应对象,chain
表示过滤器链对象。通过调用chain.doFilter(request, response)
方法,可以将请求传递给下一个过滤器或者目标Servlet
。如果不调用该方法,则请求被阻止,不会继续处理。destroy()
:销毁方法,在过滤器被销毁时调用一次,可以用来释放资源。
使用过滤器有两种方式:注解方式和XML
方式。
注解方式是通过在过滤器类上添加@WebFilter
注解来配置过滤器的属性,如拦截路径,初始化参数等。
XML
方式是通过在web.xml
文件中添加<filter>
和<filter-mapping>
标签来配置过滤器的属性。
两种方式都可以实现相同的功能,但是注解方式更简洁方便。
4. 过滤器的使用场景
- 防止
SQL
注入攻击:通过对请求参数进行检查和转义,避免恶意用户输入SQL
语句造成数据库被篡改或泄露。 - 防止跨站脚本攻击(
XSS
):通过对请求参数和响应内容进行编码或过滤,避免恶意用户输入HTML
或JavaScript
代码造成网页被篡改或用户信息被窃取。 - 防止跨站请求伪造(
CSRF
):通过在表单中添加隐藏字段或者在请求头中添加自定义字段,并在服务器端进行验证,避免恶意用户利用用户已登录的身份发送非法请求。 - 实现缓存机制:通过在响应头中添加缓存相关的字段,并在服务器端判断请求是否命中缓存,可以提高网站性能和用户体验。
- 实现压缩机制:通过在响应头中添加压缩相关的字段,并在服务器端对响应内容进行压缩,可以减少网络传输的数据量和时间。
二、拦截器
1. 什么是拦截器?
拦截器是一种用于JavaWeb
应用程序中的组件,它可以在Servlet
执行之前拦截HTTP
请求,并对请求进行一些处理,比如登录验证,权限控制,日志记录,编码转换等。
拦截器可以根据需要决定是否继续执行Servlet
或者返回响应。
2. 拦截器的底层实现原理是基于动态代理的
当一个请求到达服务器时,服务器会根据请求的URL匹配相应的拦截器链。拦截器链是由一个或多个拦截器组成的,按照配置的顺序依次执行。
每个拦截器都实现了HandlerInterceptor
接口,该接口定义了三个方法:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
:在Servlet
执行之前调用,可以对请求进行预处理,也可以返回false
来阻止请求继续执行。postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
:在Servlet
执行之后调用,可以对响应进行后处理,也可以修改ModelAndView
对象。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
:在整个请求完成之后调用,可以用来释放资源或者处理异常。
使用拦截器有两种方式:注解方式和XML
方式。
注解方式是通过在拦截器类上添加@WebMvcConfigurer
注解来配置拦截器的属性,如拦截路径,排除路径等。
XML
方式是通过在web.xml
文件中添加mvc:interceptors
标签来配置拦截器的属性。两种方式都可以实现相同的功能,但是注解方式更简洁方便。
3. 拦截器的使用场景
- 登录验证:检查用户是否已经登录,如果没有登录则跳转到登录页面或者返回错误信息。
- 权限控制:检查用户是否有访问某个资源的权限,如果没有则提示错误信息或者跳转到其他页面。
- 日志记录:记录用户的访问信息,如
IP
地址,访问时间,访问路径等。 - 编码转换:设置请求和响应的字符编码,解决中文乱码问题。
- 性能监控:记录请求的开始时间和结束时间,计算请求的处理时间和响应时间。
三、拦截器和过滤器的主要区别
- 拦截器是基于动态代理的,它可以在目标方法执行前后或者异常时进行增强处理。过滤器是基于函数回调的,它只能在请求进入或者离开容器时进行过滤操作。
- 拦截器是
SpringMVC
框架提供的,它只对控制器方法有效,而过滤器是Servlet
规范定义的,它对所有的请求都有效,包括静态资源。 - 拦截器可以访问控制器方法的上下文信息,如方法参数,返回值,异常等。过滤器只能访问请求和响应对象,不能获取具体的业务逻辑信息。
- 拦截器可以通过返回值来控制请求是否继续执行,如果返回
false
,则请求被阻止。过滤器没有这样的功能,只能通过转发或者重定向来改变请求的流程。 - 拦截器可以实现多个拦截器链式调用,而且调用顺序是可控的。过滤器也可以有多个过滤器依次执行,但是调用顺序是由容器决定的。
文章来源:https://blog.csdn.net/qq_37726813/article/details/135318212
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!