自定义拦截器:

<package name="inter" namespace="/demo" extends="struts-default">
<interceptors>
<interceptor name="permission" class="cn.itcast.interceptor.PermissionInterceptor" />
<interceptor-stack name="permissionStack">
<interceptor-ref name="defaultStack" /><!-- 系统拦截器必须 -->
<interceptor-ref name="permission" />
</interceptor-stack>
</interceptors>
<global-results>
<result name="success">/WEB-INF/page/message.jsp</result>
</global-results>
<action name="list_*" class="cn.itcast.h_action.HelloWorldAction"
method="{1}">
<interceptor-ref name="permissionStack" />
</action>
</package>
因为struts2中如文件上伟,数据验证,封装请求参数到action等功能都是由系统默认的defalultStack中的
拦截实现的,所以我们定义的拦截器需要引用系统默认的defaultStack,这样应用才可以使用struts2框架提供的众多功能。
如果希望包下的所有action都使用自定义的拦截器,可以通过<defalut-interceptor-ref name="permissionStack"/>
拦截器定义为默认拦截器。注意:每个包只能指定一个默认拦截器。另外,一但我们为该包中的某个action显式指定了某个拦截器,
则默认拦截器不会起作用。

案例题:

如果用户登录后可以访问action中的所有方法
user.jsp{
//设置用户为登录状态,session
}
如果用户没有登录不允许访问action中的方法,并且提示"你没有权限执行该操作"


案例示例:


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">

<struts>
<package name="inter" namespace="/demo" extends="struts-default">
<interceptors>
<interceptor name="permission"
class="cn.itcast.interceptor.PermissionInterceptor" />
<interceptor-stack name="permissionStack">
<interceptor-ref name="defaultStack" /><!-- 系统拦截器必须 -->
<interceptor-ref name="permission" />
</interceptor-stack>
</interceptors>

<!-- <default-interceptor-ref name="permissionStack"/>所有包都使用这个拦截器,如果action内再次使用拦截器,这个默认的将会失效 -->
<global-results>
<result name="success">/WEB-INF/page/message.jsp</result>
</global-results>
<action name="list_*" class="cn.itcast.h_action.HelloWorldAction"
method="{1}">
<!-- <interceptor-ref name="permissionStack"/>不想失效,又想保留所有包拦截器,就在这再次定义 -->
<interceptor-ref name="permissionStack" />
</action>
</package>
</struts>


package cn.itcast.h_action;

public class HelloWorldAction {
private String message;

public String getMessage() {
return message;
}

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

public String addUI() {
this.message = "addUI";
return "success";
}

public String execute() {
this.message = "execute";
return "success";
}
}


package cn.itcast.interceptor;

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

public class PermissionInterceptor implements Interceptor {

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

}

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

}

@Override
public String intercept(ActionInvocation invocation) throws Exception {
Object user = ActionContext.getContext().getSession().get("user");
if (user != null) {// user:null
return invocation.invoke();// 如果user不为null,代表用户已经登录,允许执行action中的方法invocation.invoke():success
}
ActionContext.getContext().put("message", "你没有权限执行该操作");
return "success";
}

}

user.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
request.getSession().setAttribute("user", "itcast");
%>
用户已经登录

quit.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
request.getSession().removeAttribute("user");
%>
用户已经退出登录

message.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>

<title>My JSP 'msessage.jsp' starting page</title>

<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">


</head>

<body>
${message }
</body>
</html>


ps:

退出登录或者没登录前执行步骤:  
如果没登录前或者执行了quit.jsp(退出登录),访问list_execute,进入execute方法,message="execute" 返回success,然后执行拦截器permissionStack,然后再permissionStack里从上往下执行,
再执行defaultStack成功后,再执行permission进入permission拦截器内里面的PermissionInterceptor类,
首选获取Object user = ActionContext.getContext().getSession().get("user");,判断其user是空的,
执行ActionContext.getContext().put("message", "你没有权限执行该操作");,覆盖message值为message="你没有权限执行该操作" 返回success,直接给message赋值"你没有权限执行该操作"
message.jsp网页网页显示"你没有权限执行该操作"


登录成功执行步骤:
如果执行了user.jsp(登录成功),访问list_execute,进入execute方法,message="execute" 返回success,然后执行拦截器permissionStack,然后再permissionStack里从上往下执行,
再执行defaultStack成功后,再执行permission进入permission拦截器内里面的PermissionInterceptor类,
首选获取Object user = ActionContext.getContext().getSession().get("user");,判断其user值是itcast,直接返回success,message值不变,message.jsp网页显示"execute"
message.jsp网页得到值为"你没有权限执行该操作"