源码下载地址: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中的操作成功,显示结果如下:
(3)输入http://localhost:8080/Struts2/quit.jsp,进行用户退出登录,显示结果如下:
(4)输入http://localhost:8080/Struts2/control/user/UserLogin_execute.action,访问action中的操作失败,显示结果如下: