Struts2拦截器的基本用法

本文介绍两种Struts2拦截器实现方法:继承抽象拦截器(AbstractInterceptor)及方法过滤拦截器(MethodFilterInterceptor)。通过具体示例代码展示了如何自定义拦截器并应用于Struts2框架中。
[size=xx-large][color=blue]方法一:[/color][/size]
[color=blue]继承抽象截器(AbstractInterceptor)[/color]
拦截器Java代码:

package action;

import java.util.Map;
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation invocation) throws Exception {
ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
Object user = session.get("user");

if (user == null) {
ActionSupport action = (ActionSupport) invocation.getAction();
action.addActionError("请先登录!");
return Action.LOGIN;
} else {
return invocation.invoke();
}
}
}


Struts.xml文件:

...
<package name="Node" extends="struts-default" namespace="/Node">
<interceptors>
<!-- 定义AuthInterceptor拦截器 -->
<interceptor name="auth" class="action.AuthInterceptor"/>
<!-- 定义自己的拦截器栈,在Action的配置中,可以直接引用这个拦截器栈 -->
<interceptor-stack name="securityStack">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="auth"/>
</interceptor-stack>
</interceptors>

<!--<default-interceptor-ref name="securityStack"/>-->

<global-results>
<result name="login">/login.jsp</result>
</global-results>

<action name="show" method="show" class="action.NodeAction">
<result>show.jsp</result>
<interceptor-ref name="securityStack"/>
</action>

...

</package>
...

在21行,如果直接用自己的拦截器<interceptor-ref name="authStack"/>,而不用拦截器栈时的话,默认拦截器的功能被取消了,有可能出错。
所以需要在<interceptor-ref name="authStack"/>后边加上<interceptor-ref name="defaultStack"/>这一句,再次显式的定义使用默认拦截器栈:

<action name="show" method="show" class="action.NodeAction">
<result>show.jsp</result>
<interceptor-ref name="authStack"/>
<interceptor-ref name="defaultStack"/>
</action>



[size=xx-large][color=blue]方法二:[/color][/size]
[color=blue]继承方法过滤拦截器(MethodFilterInterceptor)[/color]
拦截器Java代码:

package action;

import java.util.Map;

import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class AuthInterceptor extends MethodFilterInterceptor{
@Override
protected String doIntercept(ActionInvocation invocation) throws Exception {
ActionContext ctx = ActionContext.getContext();
Map session = ctx.getSession();
Object user = session.get("user");

if (user == null) {
ActionSupport action = (ActionSupport) invocation.getAction();
action.addActionError("请先登录!");
return Action.LOGIN;
} else {
return invocation.invoke();
}
}
}


Struts.xml文件:

...
<package name="Node" extends="struts-default" namespace="/Node">
<interceptors>
<!-- 定义LoggerInterceptor拦截器 -->
<interceptor name="logger" class="action.LoggerInterceptor">
<param name="includeMethods"></param>
<param name="excludeMethods"></param>
</interceptor>
<!-- 定义AuthInterceptor拦截器 -->
<interceptor name="auth" class="action.AuthInterceptor">
<param name="includeMethods">show,edit</param>
<param name="excludeMethods">login</param>
</interceptor>

<!-- 定义自己的拦截器栈,在Action的配置中,可以直接引用这个拦截器栈 -->
<interceptor-stack name="myStack">
<interceptor-ref name="logger"/>
<interceptor-ref name="auth"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>

<!-- 默认拦截器 -->
<default-interceptor-ref name="myStack"/>

<global-results>
<result name="login">/login.jsp</result>
</global-results>

<action name="show" method="show" class="action.NodeAction">
<result>show.jsp</result>
<!-- 自己的拦截器 -->
</action>

...

</package>
...

第26行,配置了默认的拦截器引用,这样在<action中就不用写<interceptor-ref了。
如果需要在<action中单独配置另外的拦截器xxxStack,可以在34行处加入:

<action name="show" method="show" class="action.NodeAction">
<result>show.jsp</result>
<interceptor-ref name="xxxStack"/>
<interceptor-ref name="defaultStack"/>
</action>

[quote]NOTE: If method name are available in both includeMethods and excludeMethods, it will still be considered as an included method. In short includeMethods takes precedence over excludeMethods.[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值