过滤器和拦截器的区别
一、过滤器
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,则请求被阻止。过滤器没有这样的功能,只能通过转发或者重定向来改变请求的流程。
- 拦截器可以实现多个拦截器链式调用,而且调用顺序是可控的。过滤器也可以有多个过滤器依次执行,但是调用顺序是由容器决定的。