Struts2拦截器 Interceptor

Interceptor(拦截器)是Struts2的一个非常强大的工具,有许多功能都是构建于它之上,如国际化、转换器,校验等。
什么是拦截器
拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
实现原理
Struts 2的拦截器实现相对简单。当请求到达Struts 2的ServletDispatcher时,Struts 2会查找配置文件,并根据其配置实例化相对的拦截器对象,然后串成一个list,最后一个一个地调用列表中的拦截器,如图所示:

配置和使用已有的拦截器
只需要在struts.xml配置文件中通过“”将struts-default.xml文件包含进来,并继承其中的struts-default包,最后在定义Action时,使用“”引用拦截器或拦截器栈(interceptor stack)。
一旦你继承了struts-default包,所有Action都会调用拦截器栈 ——defaultStack。
当然,在Action配置中加入“”可以覆盖defaultStack。

自定义拦截器
在Struts 2自定义拦截器是相当容易的一件事。
在开始创建自定义拦截器前,切记以下原则:
所有的拦截器必须是无状态的,不要使用在API提供的ActionInvocation之外的任何东西。
要求拦截器是无状态的原因很简单是,Struts 2不能保证为每一个请求或者action创建一个实例,所以如果拦截器带有状态,会引发并发问题。

以下例子演示通过继承AbstractInterceptor,实现拦截器。

1.首先,创建一个检查是否登录的类,CheckLogin.java,代码如下:

public class CheckLogin extends AbstractInterceptor {
   
    @Override
    public String intercept(ActionInvocation ai) throws Exception {

        ActionContext ctx = ai.getInvocationContext();
        Map session = ctx.getSession();
        String user = (String) session.get("user");
        if (user != null) {
            return ai.invoke();
        } else {
            return "login";
        }
    }
}

可以看出,其实拦截器就是一个非常普通的类,代码相当简单,我们通过检查session中的user为空,判断用户是否登陆,未登录的话,返回“login”,使用户跳转到首页。

2.配置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="upload"  extends="struts-default">
        <!-定义拦截器->
        <interceptors>
            <!-定义权限拦截器->
            <interceptor name="checkLogin" class="edu.bjtu.common.filter.CheckLogin"></interceptor>
        <interceptor-stack name="mydefaultstcak">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="checkLogin"></interceptor-ref>
            </interceptor-stack>
    </interceptors>
   
    <default-interceptor-ref name="mydefaultstcak"></default-interceptor-ref>
   
    <global-results>
            <result name="login">/fail.jsp</result>
        </global-results>

        <!-上传文件->
        <action name="uploadAction" class="uploadAction">
            <result name="success">/jsp/resource/upload.jsp</result>
            <interceptor-ref name="defaultStack"></interceptor-ref>
            <interceptor-ref name="checkLogin"></interceptor-ref>
        </action>
    </package>
</struts>

通过以上步骤就简单完成立一个拦截器。
以上代码和上次的SSH实现文件上传功能相结合,就能实现在用户点击上传文件Action后判断是否登录,如果没登录,则跳转到首页。

无觅相关文章插件,快速提升流量

, ,

发表评论