Struts2_自定义拦截器

47 篇文章 0 订阅

自定义拦截器:

	<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网页得到值为"你没有权限执行该操作"。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值