过滤器和拦截器是Web开发中常用的两种技术,它们都扮演着请求和响应处理过程中的重要角色。尽管它们的目的相似,即对请求进行拦截和处理,但它们在实现方式、使用场景以及控制粒度上存在差异。
过滤器(Filter):JavaWeb的守门人
在JavaWeb领域,过滤器是一种运行在请求进入Servlet之前和响应发送给客户端之前的组件。它主要用于处理HTTP请求和响应的预处理和后处理。
过滤器的关键作用:
-
预处理与后处理: 过滤器可以在请求到达Servlet之前或响应被发送给客户端之前执行操作,如日志记录、权限控制、字符编码转换、数据压缩等。 -
增强HTTP请求和响应: 通过对请求和响应的处理,过滤器可以实现对它们的控制和增强。 -
统一处理逻辑: 过滤器能够在应用程序中实现统一的请求和响应处理逻辑,提升代码的复用性和可维护性。
实践中的过滤器:使用Filter接口
1、继承Filter接口
Filter接口有3个方法,但只有 doFilter()
未被实现,我们只需要实现该方法即可
public class Test01Filter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 自定义处理逻辑
// 放行:chain.doFilter(request, response);
}
}
2、配置过滤器(Filter)拦截路径
-
使用注解的方式
filterName
:过滤器名称servletNames
:指定对哪些servlet进行过滤asyncSupported
:是否支持异步模式urlPatterns
/value
:指定拦截路径,作用相同,只能使用一个 -
配置文件的方式
<filter>
<filter-name>test01Filter</filter-name>
<filter-class>com.xxx.lurenjia.filter.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>test01Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
拦截器(Interceptor):Spring MVC的调度员
在Spring MVC框架中,拦截器用于在处理器执行前后以及完成请求处理后进行拦截处理。
拦截器的主要职责:
-
请求预处理与后处理: 实现日志记录、权限校验、请求数据预处理、国际化等功能。 -
细粒度控制: 拦截器专为Spring MVC设计,提供了对请求的更细粒度控制。 -
灵活配置: 可以全局配置或针对特定的Controller配置拦截器。
1、创建自定义的拦截器
方式一:
实现 HandlerInterceptor
接口preHandle()
:调用控制器类的请求处理方法之前执行,返回一个boolean类型,如果返回值是true,会继续执行后面的流程,否则,中断流程执行postHandle()
:在调用请求处理方法之后,把请求转发给视图之前执行afterCompletion()
:视图主键执行完毕,把响应结果返回给客户端之前执行
方式二:
继承 HandlerInterceptorAdapter
适配器类 HandlerInterceptorAdapter类实现了HandlerInterceptor接口,但并为做任何处理,都是一些空方法,仅仅是为了简化开发
public class MyInterceptor implements HandlerInterceptor {
// 在Controller方法执行前调用
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
// 返回true继续流程,返回false中断执行
return true;
}
// 在Controller方法执行后调用
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
// 后处理逻辑
}
// 在完成请求处理后调用
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
// 清理资源等
}
}
2、配置拦截器
<mvc:interceptors>
<!-- 配置拦截器,可以有多个 -->
<mvc:interceptor>
<!-- 配置拦截器所拦截的url -->
<mvc:mapping path="/test" /> <!-- 会拦截 /test 请求,/** 指拦截所有请求
<mvc:exclude-mapping path="/login" /> <!-- 配置不需要拦截的路径 -->
<bean class="xxx.拦截器类">
<mvc:interceptor>
</mvc:interceptors>
原文始发于微信公众号(代码之旅):过滤器和拦截器
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/203663.html