使用Struts 拦截namespace进行权限控制

        有时候我需要在几个包下都需要进行同一个权限控制。如在购物网站中,我们需要进入个人中心、下订单、评价

商品等等都需要进行登录权限控制,但是这几个模块并不是位于同一个package下。Struts提供的拦截器,我们可以实

现action下拦截,我们虽然可以在每一个package都配置这个拦截器,但是是相当的麻烦。这个时候我们可以利用拦

截器实现拦击package。将需要进行权限控制package放入拦截器中就可以实现了。

        首先我们需要在struts.xml下进行拦截器的配置。

<package name="main" extends="struts-default">
		<interceptors>
			<interceptor name="authorizationInterceptor" class="syxh.common.aop.SystemInterceptor"></interceptor>
			<interceptor-stack name="jwzhptStack">
				<interceptor-ref name="defaultStack"></interceptor-ref>
				<interceptor-ref name="authorizationInterceptor"></interceptor-ref>
			</interceptor-stack>
		</interceptors>  

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

		<global-results>
			<result name="loginfailure" type="redirectAction">
				<param name="namespace">/index</param>
				<param name="actionName">index</param>
			</result>
		</global-results>

		<global-exception-mappings>
			<exception-mapping result="input" exception="*">/login.jsp</exception-mapping>
		</global-exception-mappings>
	</package>

        上面配置的main ,所以的package都要继承main,即:extends=”main”,否则实现不了。

        struts.xml中,使用了拦截器栈,里面包含两个拦截器,一个是默认的defaultStack,一个是进行权限控制的

authorizationInterceptor。

        拦截器实现类:SystemInterceptor.java

public class SystemInterceptor extends AbstractInterceptor{

	private static final long serialVersionUID = -1819593755738908387L;
	private static final String WITHOUT = "/index, /author, /common, /indexzp";   //不需要进行权限控制的namespace

	public void destroy(){
	}

	public void init(){
	}

	public String intercept(ActionInvocation invocation) throws Exception{
		String namespace = invocation.getProxy().getNamespace();       //获取namespace
		if (WITHOUT.indexOf(namespace) >= 0){
			return invocation.invoke();
		}

		Map<?, ?> session = invocation.getInvocationContext().getSession();
		UserBean user = (UserBean) session.get("currentUser");
		if (user == null){           //没有登录
			return "loginfailure";
		} 
		return invocation.invoke();   //已登录
	}

}

        上面的拦截器实现类,指定了几个namespace是不需要进行权限控制的,除此之外其他的namespace都要进行

权限控制。

          其他package只需要继承main既可实现权限控制。

	<package name="user" namespace="/user" extends="main">
		<action name="userCenter_*" class="syxh.grzx.action.UserCenterAction" method="{1}">
			<result name="updatePasswordUI">/jsp/grzx/updatePassword.jsp</result>
			<result name="updateError">/jsp/grzx/updatePassword.jsp</result>
			<result name="updateSuccess" type="redirect">/zp/myWorksHome.action</result>
			<result name="updatePhoteUI">/jsp/grzx/updatePhoto.jsp</result>
			<result name="updateInfoUI">/jsp/grzx/updateInfo.jsp</result>
		</action>
	</package>

        注:由于这个拦截器主要是根据namespace来进行控制的,所以在配置package,要添加namespace。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大明哥_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值