拦截器是一种常见的设计模式,它允许我们在程序执行的过程中,添加一些额外的逻辑,并对程序的执行流程进行控制。在 Java Web 开发中,拦截器也得到了广泛的应用,例如在 Struts2 和 Spring 框架中都可以使用拦截器来处理用户请求。
在拦截器中,AbstractInterceptor 是一个核心的组件,它定义了一组抽象方法,用于实现拦截器的各种逻辑。本文将深入了解 AbstractInterceptor,讲解它在拦截器设计模式中的作用以及如何使用它来实现自定义拦截器。
一、AbstractInterceptor 概述
AbstractInterceptor 是一个抽象类,它实现了 Interceptor 接口,并定义了 preHandle、postHandle 和 afterCompletion 等抽象方法,用于定义拦截器的逻辑。
Interceptor 接口中只有一个方法,即 intercept 方法,用于拦截请求并执行处理逻辑。在实际应用中,我们经常需要在请求执行前进行一些处理,例如权限校验、参数验证等,同时还可能需要在请求返回后进行一些后续处理,例如统计响应时间、打印日志等,这时就需要使用 preHandle、postHandle 和 afterCompletion 等方法来实现。
二、AbstractInterceptor 的具体实现
1. preHandle 方法
preHandle 方法用于在请求执行前进行处理。在这个方法中,我们可以实现权限控制、参数验证等逻辑,并返回 true 或 false,表示是否允许继续执行后续的请求处理。如果返回 false,则请求处理会中止,并返回相应的错误信息。
public abstract class AbstractInterceptor implements Interceptor {
public abstract boolean preHandle(ServletRequest request, ServletResponse response);
public abstract boolean postHandle(ServletRequest request, ServletResponse response);
public abstract void afterCompletion(ServletRequest request, ServletResponse response);
2. postHandle 方法
postHandle 方法用于在请求返回后进行处理。在这个方法中,我们可以对响应进行统计、处理错误信息等逻辑,并返回 true 或 false,表示是否允许继续执行后续的请求处理。
public abstract class AbstractInterceptor implements Interceptor {
public abstract boolean preHandle(ServletRequest request, ServletResponse response);
public abstract boolean postHandle(ServletRequest request, ServletResponse response);
public abstract void afterCompletion(ServletRequest request, ServletResponse response);
3. afterCompletion 方法
afterCompletion 方法是在请求完成后执行的。在这个方法中,我们可以进行一些资源的释放、日志的打印等操作。因为这个方法是在请求处理结束之后执行的,所以这里不能再做任何的请求处理,否则会抛出异常。
public abstract class AbstractInterceptor implements Interceptor {
public abstract boolean preHandle(ServletRequest request, ServletResponse response);
public abstract boolean postHandle(ServletRequest request, ServletResponse response);
public abstract void afterCompletion(ServletRequest request, ServletResponse response);
三、如何使用 AbstractInterceptor 实现自定义拦截器
下面我们通过一个具体的例子,来演示如何使用 AbstractInterceptor 来实现自定义拦截器。
假设我们的应用中有一个文章管理功能,需要对用户的文章操作进行权限控制。只有管理员才能够进行删除操作,普通用户只能进行查看和修改操作。我们可以通过实现一个自定义拦截器来实现这个功能。
1. 定义拦截器类
我们需要定义一个 ArticleInterceptor 类,它继承自 AbstractInterceptor 类,并实现 preHandle 方法。在 preHandle 方法中,我们可以通过获取用户的角色信息,来判断用户是否有权限进行文章的删除操作。
public class ArticleInterceptor extends AbstractInterceptor {
@Override
public boolean preHandle(ServletRequest request, ServletResponse response) {
String uri = ((HttpServletRequest) request).getRequestURI();
HttpSession session = ((HttpServletRequest) request).getSession();
User user = (User) session.getAttribute("user");
// 登录拦截
if(user == null) {
throw new BusinessException(ErrorCode.USER_NOT_LOGIN);
// 权限控制
if(uri.contains("delete")) {
if(user.getRole() != UserRole.ADMIN) {
throw new BusinessException(ErrorCode.USER_NO_PERMISSION);
return true;
@Override
public boolean postHandle(ServletRequest request, ServletResponse response) {
return true;
@Override
public void afterCompletion(ServletRequest request, ServletResponse response) {
2. 配置拦截器
我们需要在 web.xml 中配置拦截器。在 filter 中配置 FilterDispatcher,然后在 InterceptorStack 中配置拦截器的拦截顺序。
struts2
org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter
struts2
/*
/article.jsp
在这里我们将 ArticleInterceptor 添加到了拦截器栈中,并定义了DefaultStack。这样,在请求执行时,会先执行 ArticleInterceptor 中的 preHandle 方法,再执行默认的拦截器栈逻辑。
3. 编写操作处理逻辑
最后我们需要编写操作处理逻辑。这里我们使用 Struts2 框架来处理用户请求,并在请求处理前先进行权限校验。
public class ArticleAction extends ActionSupport {
public String delete() {
// 执行删除操作
return SUCCESS;
public String edit() {
// 执行编辑操作
return SUCCESS;
public String view() {
// 执行查看操作
return SUCCESS;
四、总结
拦截器是一种常见的设计模式,在 Web 应用中得到广泛的应用。AbstractInterceptor 是一个核心的组件,它定义了 preHandle、postHandle 和 afterCompletion 等抽象方法,用于实现拦截器的各种逻辑。
在使用 AbstractInterceptor 实现自定义拦截器时,我们需要继承 AbstractInterceptor 类,并实现 preHandle 方法,来实现权限控制、参数验证等逻辑。最后,我们需要在 web.xml 中配置拦截器,并在操作处理逻辑中先进行权限校验。
通过学习本文,相信读者已经对 AbstractInterceptor 的使用有了更深入的了解,可以更加灵活地运用拦截器来处理不同的业务需求。