Struts2核心拦截器

当struts2经过输入校验阶段(struts2系列---输入校验)后,接着将调用execute()业务逻辑方法。有时我们需要在执行execute()方法之前先进行比如登陆验证之类的判断。只有登陆过的用户才能进行业务操作。这时就需要用到Struts2的拦截器Interceptor。

以下为struts2拦截器用法的简单小结:

1.

struts.xml配置:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<package name="default" extends="struts-default">

<interceptors>

<!--定义拦截器-->
<interceptor name="isLogin" class="com.test.action.interceptor.IsLoginInterceptor"></interceptor>

<!--
<!-- 自定义拦截器栈-->
<interceptor-stack name="myStack">
<interceptor name="isLogin"/>
<interceptor name="defaultStack"/>
</interceptor-stack>
-->

</interceptors>

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

<!--定义全局跳转页-->
<global-results>
<result name="login" type="redirect">/login.jsp</result>
</global-results>

<action name="updateMessage" class="com.test.action.UserAction">
<result name="success">/success.jsp</result>
<result name="input">/index.jsp</result>
<result name="failure">/index.jsp</result>
<!--放入上面自定义的拦截器-->
<interceptor-ref name="isLogin"/>
<!--放入struts2默认的拦截器栈-->
<interceptor-ref name="defaultStack"/>
</action>

</package>

</struts>

当执行execute()方法之前被自定义的isLogin拦截器拦截下来进入到IsLoginInterceptor类来进行登陆验证。

IsLoginInterceptor.java:

public class IsLoginInterceptor extends AbstractInterceptor {

@Override
@SuppressWarnings("unchecked")
public String intercept(ActionInvocation invocation) throws Exception
{
//获得Session对象
Map session = invocation.getInvocationContext().getSession();
//判断session中是否有信息
if(session.get("userid") == null)
{
//无信息返回配置文件中<global-results>配置的全局页面
return Action.LOGIN;
}
else
{
//有信息继续执行execute()方法
return invocation.invoke();
}
}

}

注:defaultStack是每个<action/>默认的拦截器栈。然而当用户在<action>中放入了自定义的拦截器的时候,就必须再显式的放入defaultStack。
struts2之所以能在Action类里能做那么多功能,就是依赖于其默认的拦截器栈里定义的各种拦截器。
用户可以配置自己的拦截器栈作为默认的拦截器栈:
只需将配置中的注释解开,<action/>配置里的<interceptor/>也就无需写了。此时自定义的myStack代替了defaultStack拦截器栈

实际开发中,往往配置多个拦截器栈,配置于不同业务模块的<action/>中。
但是注意默认的拦截器栈只能是一个。


2.方法过滤拦截器

默认情况下我们为某个Action定义了拦截器,则这个拦截器会拦截该Action的所有方法。有些情况下,我们无需拦截所有的方法,此时就需要使用方法过滤拦截器。

方法过滤拦截器使用方法与普通的拦截器没什么区别:

方法过滤拦截器类继承MethodFilterInterceptor,
重写的是doIntercept(ActionInvocation invacation)方法

<action/>配置中:

<!--放入上面自定义的拦截器-->
<interceptor-ref name="isLogin">
<!-- 指定login和register方法不需要被拦截-->
<param name="excludeMethods">login,register</param>
<!-- 指定execute方法需要被拦截-->
<param name="includeMethods">execute</param>
</interceptor>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值