Struts2:自定义拦截器

源码下载地址:http://download.csdn.net/detail/zhoujing_0424/9239429
Struts2默认启用了大量通用功能的拦截器,只要我们配置Action的package继承了struts-default包,这些拦截器就会起作用。自定义拦截器,顾名思义,是用户自己定义的拦截器。下面我们实现一个简单的例子,需求如下:用户登录后可以访问action中的所有方法;如果用户没有登录,则不允许访问action中的方法,并提示“你没有权限执行该操作”。
我们用login.jsp和quit.jsp两个页面来模拟用户是否登录,页面内容如下:
login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    request.getSession().setAttribute("user", "online");
    //在session对象中加入user属性,模拟用户登录
%>
<html>
  <body>
    用户已经登录... <br>
  </body>
</html>

quit.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
    request.getSession().removeAttribute("user");
    //将user属性从session对象中移除,模拟用户退出登录
%>
<html>
  <body>
    用户已经退出登录... <br>
  </body>
</html>

要自定义拦截器需要实现import com.opensymphony.xwork2.interceptor.Interceptor接口。
PermissionInterceptor.java:

package com.zj.interceptor;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class PermissionInterceptor implements Interceptor{

    public void destroy() {
        // TODO Auto-generated method stub
    }

    public void init() {
        // TODO Auto-generated method stub
    }

    public String intercept(ActionInvocation invoaction) throws Exception {
        // TODO Auto-generated method stub
        Object user=ActionContext.getContext().getSession().get("user");//获取session中的user对象
        if(user!=null) return invoaction.invoke();//如果user不为空,代表用户已经登录,允许执行action中的方法
        //否则,用户未登录,提示"你没有权限执行该操作"
        ActionContext.getContext().put("message", "你没有权限执行该操作");
        return "success";
    }
}

UserLoginAction.java:

package cn.zj.action;

public class UserLoginAction {
    private String message;

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public String execute(){
        message="您已成功登录,可以执行该action中的操作";
        return "success";
    }
}

定义完拦截器后需要在package中注册拦截器并在action中调用拦截器。因为struts2中如文件上传、数据验证、封装请求参数到action等功能都是由系统默认的defaultStack中的拦截器实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
struts_user.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="user" namespace="/control/user" extends="struts-default">
        <!-- 注册拦截器 -->
        <interceptors>
            <interceptor name="permission" class="com.zj.interceptor.PermissionInterceptor">
            </interceptor>
            <interceptor-stack name="permissionStack"><!-- 定义拦截器栈,使用拦截器栈可以同时使用strus2的核心拦截器和用户自定义拦截器  -->
                <interceptor-ref name="defaultStack"/><!-- struts2核心拦截器 ,系统拦截器放在前面,先执行系统拦截器--> 
                <interceptor-ref name="permission"/><!-- 用户自定义拦截器放在后面 --> 
            </interceptor-stack>    
        </interceptors>
        <default-interceptor-ref name="permissionStack"></default-interceptor-ref><!-- 这种定义方式会使该包里的所有action都应用该拦截器 -->
        <action name="UserLogin_*" class="cn.zj.action.UserLoginAction" method="{1}">
            <result name="success">/WEB-INF/page/message.jsp</result>
            <interceptor-ref name="permissionStack"/><!-- 调用上述定义的拦截器栈 -->
        </action>   
    </package>
</struts>

至此,自定义拦截器已实现并注册完成,下面我们进行测试:
(1)打开浏览器,输入http://localhost:8080/Struts2/login.jsp,进行用户登录,显示结果如下:
用户登录

(2)输入http://localhost:8080/Struts2/control/user/UserLogin_execute.action,访问action中的操作成功,显示结果如下:
访问action中的操作成功

(3)输入http://localhost:8080/Struts2/quit.jsp,进行用户退出登录,显示结果如下:
用户退出登录

(4)输入http://localhost:8080/Struts2/control/user/UserLogin_execute.action,访问action中的操作失败,显示结果如下:
访问action中的操作失败

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值