• 使用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。

  • 相关阅读:
    测试文件报告
    Bug Variations
    阶段一 问答题2
    阶段一 问答题1
    HeapSort
    Git系列 (01):git clone 速度太慢解决方法
    ES6系列 (03):链判断运算符和Null 判断运算符
    ES6系列 (02):解构赋值
    ES6系列 (01):箭头函数this指向问题
    我忘却了所有,抛却了信仰,舍弃了轮回,只为,那曾在佛前哭泣的玫瑰,早已失去旧日的光泽。
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3752137.html
Copyright © 2020-2023  润新知