实现拦截器的三种方法

说是三种方法,实际上是一种方法,其实只要这个类实现了Interceptor接口,即可成为一个拦截器类。

第一种方法就是直接实现Interceptor接口,这样的话,就要实现这个接口中的三个方法。

第二种方法是继承自AbstractInterceptor类,这是个抽象类,实现了Interceptor接口,并且对里面的init()和destroy()方法进行空实现,而把intercept()方法设置为抽象方法,让继承它的子类去实现,这样的话,子类只要实现这个intercept()方法就可以了,比直接实现接口要简单一些。

第三种方法是继承自MethodFilterInterceptor,这个类叫做方法过滤拦截器,这个类继承自AbstractInterceptor,并且提供了一种机制,即可以指定对Action中某些方法进行拦截或者是不拦截,所谓拦截不拦截,指的就是拦截器中的intercept()方法是否被执行了,若没有执行,就是没有拦截,若执行了,就是拦截了。

第一、二种方法这里就不详细说明了,主要说一下第三种方法,即MethodFilterInterceptor的使用。

首先来看一下这个类的部分代码:

复制代码
public abstract class MethodFilterInterceptor extends AbstractInterceptor { 
protected transient Logger log = LoggerFactory.getLogger(getClass());

protected Set<String> excludeMethods = Collections.emptySet();
protected Set<String> includeMethods = Collections.emptySet();

public void setExcludeMethods(String excludeMethods) {
this.excludeMethods = TextParseUtil.commaDelimitedStringToSet(excludeMethods);
}

public Set<String> getExcludeMethodsSet() {
return excludeMethods;
}

public void setIncludeMethods(String includeMethods) {
this.includeMethods = TextParseUtil.commaDelimitedStringToSet(includeMethods);
}

public Set<String> getIncludeMethodsSet() {
return includeMethods;
}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
if (applyInterceptor(invocation)) {
return doIntercept(invocation);
}
return invocation.invoke();
}

protected boolean applyInterceptor(ActionInvocation invocation) {
String method = invocation.getProxy().getMethod();
// ValidationInterceptor
boolean applyMethod = MethodFilterInterceptorUtil.applyMethod(excludeMethods, includeMethods, method);
if (log.isDebugEnabled()) {
if (!applyMethod) {
log.debug("Skipping Interceptor... Method [" + method + "] found in exclude list.");
}
}
return applyMethod;
}

protected abstract String doIntercept(ActionInvocation invocation) throws Exception;

}
复制代码

 

可以看到这里面有两个成员变量:includeMethods和excludeMethods,并且有对应的get/set方法,这两个变量的类型为String类型的集合,即可以放置多个String类型的数据,其实,这两个变量就是用来存放要拦截或者是不拦截的方法的名称的。includeMethods存放要进行拦截的方法名,excludeMethods存放不进行拦截的方法名。

 

在其中还实现了intercept方法,在里面经过某个判断后,调用了一个doIntercept()方法,这个方法是抽象的,就是要其子类去实现的。那么这个判断是什么呢?这个判断就是根据includeMethods和excludeMethods中存放的方法名,进行判断是否要对其进行拦截。

因为在类中已经实现了intercept()方法,而提供了一个抽象的doIntercept()方法,所以我们只要去实现这个抽象的方法,就可以实现针对到方法的拦截器了。

下面来个简单的例子:

复制代码
拦截器类:  

package com.suo.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;
import com.suo.listeners.BeforeResultListener;

public class MyInterceptor3 extends MethodFilterInterceptor {

@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {

System.out.println("before MyInterceptor3 invoke !");

String result=invocation.invoke();

System.out.println("after MyInterceptor3 invoke !");

return result;
}
}
复制代码
配置拦截器:  

<interceptor name="myInterceptor3" class="com.suo.interceptor.MyInterceptor3"></interceptor>
复制代码
在action中引用拦截器:  

<action name="action1" class="com.suo.actions.Action1" method="myExecute">
<result name="success" type="chain">
<param name="actionName">action2</param>
</result>

<interceptor-ref name="myInterceptor3">
<param name="includeMethods">myExecute</param>
<param name="excludeMethods">execute</param><!--对myExecute进行拦截,对execute不拦截-->
</interceptor-ref>

</action>
复制代码
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中,拦截(Interceptor)是一种常见的设计模式,用于在方法调用之前或之后添加额外的逻辑处理。在Web开发中,拦截常用于处理请求、验证用户身份、记录日志等操作。下面是一个简单的示例,演示如何实现一个拦截。 首先,创建一个拦截类,实现Spring框架的`HandlerInterceptor`接口。该接口定义了三个方法,分别对应请求处理前、请求处理后和请求完成后的操作。 ```java import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在请求处理前执行的逻辑 // 返回true表示继续执行后续操作,返回false表示中断请求处理 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在请求处理后执行的逻辑 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在请求完成后执行的逻辑 } } ``` 接下来,配置拦截类,让它生效。可以通过Spring配置文件或注解的方式进行配置。 通过Spring配置文件配置拦截: ```xml <!-- 配置拦截 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <!-- 拦截所有请求 --> <bean class="com.example.MyInterceptor"/> </mvc:interceptor> </mvc:interceptors> ``` 通过注解配置拦截: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**"); // 拦截所有请求 } } ``` 以上示例中的`com.example.MyInterceptor`是自定义的拦截类,你可以根据实际需求来编写自己的拦截逻辑。在`preHandle`方法中可以进行请求的预处理,如验证用户身份、权限校验等;在`postHandle`方法中可以对响应进行处理;在`afterCompletion`方法中可以进行一些清理工作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值