struts interceptor拦截器做权限控制

本文介绍Struts拦截器的实现与配置方法,包括如何自定义拦截器类、配置拦截器栈及全局结果,并通过示例展示如何在SSH应用中进行权限控制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

interceptor 顾名思义:拦截器;

interceptor也是struts除了action外的一大特点,今天做SSH应用涉及到权限控制,初用interceptor感觉十分方便,且功能强大.

要实现struts拦截器;要继承AbstractInterceptor

内部有三个 方法 init()初始化方法;destory()销毁方法;

还有就是intercept(ActionInvocation invocation);我们拦截后要进行的操作,例如校验用户权限,就重写在这个方法里面。

例如的WEB应用,校验是否为登录用户:

package interceptor;

import java.util.Map;

import object.Admin;

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

@SuppressWarnings("serial")
public class AdminInterceptor extends AbstractInterceptor {

	@SuppressWarnings("rawtypes")
	@Override
	public String intercept(ActionInvocation invocation) throws Exception {
		ActionContext ctx = invocation.getInvocationContext();
		Map session = ctx.getSession();
		// 取出名为user的session属性
		Admin admin = (Admin) session.get("ADMIN");
		// 如果没有登陆,返回重新登陆
		if (admin != null) {
			return invocation.invoke();
		} else {
			ctx.getSession().put("tip", "请先登录系统!");
			return "login";
		}
	}

}


拦截器的类实现了,接下来要做的就是 将其配置到 struts.xml的action中

个action添加拦截器前,需要声明:

<interceptors>
   <interceptor name="AdminInterceptor" class="interceptor.AdminInterceptor" />
</interceptor>

注意拦截器的声明值只在相同的package生效的;

所以要想使用此拦截器 那么对应的action应与它处于同一包下;

对于用户登录校验,因结果都是一样 我们可以声明全局结果:

<!-- 定义全局结果 -->
        <global-results>
        	<result name="login" type="redirect">login.jsp</result>
        </global-results>


我们也可以封装拦截器栈:拦截器栈 是多个拦截器按一定顺序封装在一起;合作达到某种需求。

<interceptors>
			<interceptor name="AdminInterceptor" class="interceptor.AdminInterceptor" />
			<interceptor-stack name="mydefault">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="AdminInterceptor"></interceptor-ref>
			</interceptor-stack>
		</interceptors>


我们也可以为同一package下的action指定默认的拦截器:

<default-interceptor-ref name="mydefault"></default-interceptor-ref>

下面给我 我对账户增删改差操作前进行用户是否登陆的拦截器配置:

<package name="adminaction" extends="struts-default">
    	<interceptors>
			<interceptor name="AdminInterceptor" class="interceptor.AdminInterceptor" />
			<interceptor-stack name="mydefault">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="AdminInterceptor"></interceptor-ref>
			</interceptor-stack>
		</interceptors>
		<default-interceptor-ref name="mydefault"></default-interceptor-ref>
		
		<!-- 定义全局结果 -->
        <global-results>
        	<result name="login" type="redirect">login.jsp</result>
        </global-results>
        
        <action name="loginAction" class="adminaction.LoginAction">
            <result name="success">index.jsp</result>
            <result name="error">login.jsp</result>
            <result name="input">login.jsp</result>
            <result name="none">login.jsp</result>
            <interceptor-ref name="defaultStack"></interceptor-ref>
        </action>
        <action name="addAction" class="adminaction.AdminAddAction">
            <result name="success">upDataStudentListAction</result>
            <result name="error">addAdmin.jsp</result>
            <result name="input">addAdmin.jsp</result>
        </action>
        <action name="deleteAction" class="adminaction.AdminDeleteAction">
            <result name="success" type="redirectAction">exitAction</result>
            <result name="error">deleteAdmin.jsp</result>
            <result name="input">deleteAdmin.jsp</result>
        </action>
        <action name="repasswordAction" class="adminaction.AdminRepasswordAction">
            <result name="success">upDataStudentListAction</result>
            <result name="error">AdminRepassword.jsp</result>
            <result name="input">AdminRepassword.jsp</result>        
        </action>
        <action name="exitAction" class="adminaction.ExitAction">
        <!-- 定义处理结果字符串和资源之间的映射关系 -->
            <result name="success" type="redirect">login.jsp</result>
        </action>
    </package>


注:因为登录操作 不需要校验用户权限:所以 在loginAction 里面添加系统默认拦截器,这样就覆盖掉package的拦截器。防止登录失效。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值