Struts2拦截器

来源:互联网 发布:避孕套用途知乎 编辑:程序博客网 时间:2024/06/05 07:39

Struts2拦截器

Struts2大多数核心功能是通过拦截器实现的,每个拦截器完成某项功能。
拦截器方法在Action执行之前或者之后执行。

拦截器工作原理
拦截器的执行过程是一个递归的过程
拦截器工作原理

自定义拦截器

自定义拦截器主要有两种方式:

  • 实现Interceptor接口
  • 继承抽象拦截器类AbstractInterceptor

实现Interceptor接口

Interceptor接口中定义了三个方法

  • init(): 在拦截器执行之前调用init()方法,主要用于初始化系统资源
  • destroy(): 在拦截器实例被销毁之前,系统将会调用该方法来释放和拦截器相关的资源
  • intercept(): 拦截器的核心方法

AbstractInterceptor

步骤:

  1. 创建一个继承自AbstractInterceptor的类
  2. 实现intercept方法
  3. 在struts.xml中配置

下面已一个例子来说明,该例子,是计算调用Action所话费的时间
如下,一个<a>标签,来调用对相应的action。

<a href="timer">访问Action并计算执行Action花费的时间</a>

创建一个拦截TimerInterceptor

package com.imooc.interceptor;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;/* * 计算执行Action话费的时间 */public class TimerInterceptor extends AbstractInterceptor {    @Override    public String intercept(ActionInvocation invocation) throws Exception {        //执行Action之前        long start = System.currentTimeMillis();        //执行下一个拦截器,如果是最后一个拦截器,则执行目标Action        String result = invocation.invoke();        //执行Action之后        long end = System.currentTimeMillis();        System.out.println("执行Action花费时间:"+(end-start)+"ms");        return result;    }}

在struts.xml中配置:

<struts>    <package name="default" namespace="/" extends="struts-default">        <!-- 注册拦截器 -->        <interceptors>            <interceptor name="mytimer" class="com.imooc.interceptor.TimerInterceptor"></interceptor>        </interceptors>        <action name="timer" class="com.imooc.action.TimerAction">            <result>/success.jsp</result>            <!-- 引用拦截器 -->            <interceptor-ref name="mytimer"></interceptor-ref>        </action>    </package></struts>

Struts2内置拦截器

默认拦截器栈

    <action name="timer" class="com.imooc.action.TimerAction">        <result>/success.jsp</result>        <!--  引入默认的拦截器栈-->        <interceptor-ref name="defaultStack"></interceptor-ref>        <!-- 引用拦截器 -->        <interceptor-ref name="mytimer"></interceptor-ref>    </action>
  • params拦截器 - 负责将请求参数设置为Action属性
  • staticParams拦截器 - 将配置文件中action元素的子元素param参数设置为Action属性
  • servletConfig拦截器 - 将源于Servlet API的各种对象注入到Action,必须实现对应接口
  • fileUpload拦截器 - 对文件上传提供支持,将文件和元数据设置为对应的Action属性
  • exception拦截器 - 捕获异常,并且将异常映射到用户自定义的错误页面
  • validation拦截器 - 调用验证框架进行数据验证

例子

开发权限验证拦截器

主要功能是已登录用户可以访问管理页面,未登录用户则不能访问管理页面。

登录页面login.jsp

<h2>用户登录</h2><!-- 错误提示 -->${loginError} <form action="login.action" method="post">    用户名:<input type="text" name="username"><br/>    密    码:<input type="password" name="password"><br/>    <input type="submit" value="登录"> </form>

创建LoginAction,使用session保存用户名

package com.imooc.action;import java.util.Map;import org.apache.struts2.interceptor.SessionAware;import com.opensymphony.xwork2.ActionSupport;public class LoginAction extends ActionSupport implements SessionAware {    private String username;    private String password;    private Map<String, Object> session;    @Override    public void setSession(Map<String, Object> session) {        this.session = session;    }    //处理登录请求    public String login()    {        if ("admin".equals(username) && "123".equals(password)) {            session.put("loginInfo", username);            return SUCCESS;        }else{            session.put("loginError", "用户名或密码不正确");            return ERROR;        }    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public String getPassword() {        return password;    }    public void setPassword(String password) {        this.password = password;    }   }

创建权限拦截器AuthInterceptor

package com.imooc.interceptor;import java.util.Map;import com.opensymphony.xwork2.ActionContext;import com.opensymphony.xwork2.ActionInvocation;import com.opensymphony.xwork2.interceptor.AbstractInterceptor;public class AuthInterceptor extends AbstractInterceptor {    @Override    public String intercept(ActionInvocation invocation) throws Exception {        ActionContext context = ActionContext.getContext();        Map<String, Object> session = context.getSession();        if (session.get("loginInfo") != null) {            String result = invocation.invoke();            return result;        }else{            return "login";        }    }}

在struts.xml中配置信息如下:

<struts>    <package name="default" namespace="/" extends="struts-default">        <!-- 注册拦截器 -->        <interceptors>            <interceptor name="auth" class="com.imooc.interceptor.AuthInterceptor"></interceptor>            <!-- 自定义拦截器栈myStack,组合了defaultStack和auth -->            <interceptor-stack name="myStack">                <interceptor-ref name="defaultStack"></interceptor-ref>                <interceptor-ref name="auth"></interceptor-ref>            </interceptor-stack>        </interceptors>        <!-- 通过此Action访问后台管理页面,需要判断用户是否已登录        如果未登录,则返回登录视图 -->        <action name="auth">            <result>/WEB-INF/page/manager.jsp</result>            <result name="login">/login.jsp</result>            <!-- 引用自定义的拦截器栈 -->            <interceptor-ref name="myStack"></interceptor-ref>        </action>        <action name="login" class="com.imooc.action.LoginAction" method="login">            <result>/WEB-INF/page/manager.jsp</result>            <result name="error">/login.jsp</result>        </action>    </package></struts>

SessionAwared的用法,参考:

  • Sessions in struts2 application
  • How to use sessions with Struts 2
0 0
原创粉丝点击