zoukankan      html  css  js  c++  java
  • 使用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。

  • 相关阅读:
    进程池,线程池,协程,gevent模块,协程实现单线程服务端与多线程客户端通信,IO模型
    线程相关 GIL queue event 死锁与递归锁 信号量l
    生产者消费者模型 线程相关
    进程的开启方式 进程的join方法 进程间的内存隔离 其他相关方法 守护进程 互斥锁
    udp协议 及相关 利用tcp上传文件 socketserver服务
    socket套接字 tcp协议下的粘包处理
    常用模块的完善 random shutil shevle 三流 logging
    day 29 元类
    Django入门
    MySQL多表查询
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3752137.html
Copyright © 2011-2022 走看看