如何使用Struts2拦截器 下载本文

内容发布更新时间 : 2024/5/3 1:06:02星期一 下面是文章的全部内容请认真阅读。

如何使用struts2拦截器,或者自定义拦截器。特别注意,在使用拦截器的时候,在Action里面必须最后一定要引用struts2自带的拦截器缺省堆栈defaultStack,如下(这里我是引用了struts2自带的checkbox拦截器):

也可以改为对全局Action设置自己需要的拦截器,如下:

在struts.xml里面定义全局的配置设置

struts-action.xml里面配置Action如下:

/jsp/smeishop/admin/index.jsp

/jsp/smeishop/admin/logon.jsp

你的拦截器可以正常工作了!!HOHO 以下是参考资料

struts2自带的配置及其拦截器配置

Struts2 拦截器 [Interceptor]

拦截器的工作原理如上图,每一个Action请求都包装在一系列的拦截器的内部。拦截器可以在Action执行直线做相似的操作也可以在Action执行直后做回收操作。

每一个Action既可以将操作转交给下面的拦截器,Action也可以直接退出操作返回客户既定的画面。

如何自定义一个拦截器?

自定义一个拦截器需要三步:

1 自定义一个实现Interceptor接口(或者继承自AbstractInterceptor)的类。

2 在struts.xml中注册上一步中定义的拦截器。

3 在需要使用的Action中引用上述定义的拦截器,为了方便也可将拦截器定义为默认的拦截器,这样在不加特殊声明的情况下所有的Action都被这个拦截器拦截。

Interceptor接口声明了三个方法:

public interface Interceptor extends Serializable {

void destroy();

void init();

String intercept(ActionInvocation invocation) throws Exception;

}

Init方法在拦截器类被创建之后,在对Action镜像拦截之前调用,相当于一个post-constructor方法,使用这个方法可以给拦截器类做必要的初始话操作。

Destroy方法在拦截器被垃圾回收之前调用,用来回收init方法初始化的资源。

Intercept是拦截器的主要拦截方法,如果需要调用后续的Action或者拦截器,只需要在该方法中调用invocation.invoke()方法即可,在该方法调用的前后可以插入Action调用前后拦截器需要做的方法。如果不需要调用后续的方法,则返回一个String类型的对象即可,例如Action.SUCCESS。

另外AbstractInterceptor提供了一个简单的Interceptor的实现,这个实现为:

public abstract class AbstractInterceptor implements Interceptor {

public void init() { }

public void destroy() { }

public abstract String intercept(ActionInvocation invocation) throws Exception;

}

在不需要编写init和destroy方法的时候,只需要从AbstractInterceptor继承而来,实现intercept方法即可。

我们尝试编写一个Session过滤用的拦截器,该拦截器查看用户Session中是否存在特定的属性(LOGIN属性)如果不存在,中止后续操作定位到LOGIN,否则执行原定操作,代码为:

public class CheckLoginInterceptor extends AbstractInterceptor { public static final String LOGIN_KEY = \

public static final String LOGIN_PAGE = \

public String intercept(ActionInvocation actionInvocation) throws Exception {

System.out.println(\ // 对LoginAction不做该项拦截

Object action = actionInvocation.getAction(); if (action instanceof LoginAction) {

System.out.println(\ login action.\

return actionInvocation.invoke(); }

// 确认Session中是否存在LOGIN

Map session = actionInvocation.getInvocationContext().getSession();

String login = (String) session.get(LOGIN_KEY); if (login != null && login.length() > 0) { // 存在的情况下进行后续操作。

System.out.println(\ return actionInvocation.invoke(); } else {

// 否则终止后续操作,返回LOGIN

System.out.println(\ return LOGIN_PAGE; } } }

注册拦截器

name=\

class=\or\

将上述拦截器设定为默认拦截器:

这样在后续同一个package内部的所有Action执行之前都会被login拦截。 Struts2(XWork)提供的拦截器的功能说明: 拦截器 名字 说明 Alias alias 在不同请求之间将请求参数Interceptor 在不同名字件转换,请求内容不变 Chaining chain 让前一个Action的属性可Interceptor 以被后一个Action访问,现在和chain类型的result()结合使用。 Checkbox checkbox 添加了checkbox自动处理Interceptor 代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。 Cookies cookies 使用配置的name,value来Interceptor 是指cookies Conversion conversionError 将错误从ActionContext中Error Interceptor 添加到Action的属性字段中。 Create Session createSession 自动的创建HttpSession,Interceptor 用来为需要使用到HttpSession的拦截器服务。 Debugging debugging 提供不同的调试用的页面来Interceptor 展现内部的数据状况。 Execute and execAndWait 在后台执行Action,同时将Wait Interceptor 用户带到一个中间的等待页面。 Exception exception 将异常定位到一个画面 Interceptor File Upload fileUpload 提供文件上传功能 Interceptor I18n i18n 记录用户选择的locale Interceptor Logger logger 输出Action的名字 Interceptor Message Store store 存储或者访问实现Interceptor ValidationAware接口的Action类出现的消息,错误,字段错误等。