Struts2拦截器

本文介绍了Struts2中拦截器的工作原理及自定义方法,包括实现Interceptor接口和继承AbstractInterceptor类的方式。并通过实例展示了如何创建自定义拦截器来计算Action执行时间,以及开发权限验证拦截器。

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的用法,参考:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值