【Java EE 學習 75 下】【數據採集系統第七天】【二進制運算實現權限管理】【使用反射初始化權限表】【權限捕獲攔截器動態添加權限】

1、使用反射動態添加權限

在該系統中,我使用struts2的時候很是規範,訪問的Action的形式都是"ActionClassName_MethodName.action?參數列表",因此能夠很是方便的使用反射初始化權限表。java

比較關鍵的是獲取全部Action類所在的包的方法:web

URL url=ClassLoader.getSystemResource("com/kdyzm/struts/action");
File dir=new File(url.toURI());

  而後獲取全部文件(有不是class後綴名的文件):spring

File[] fiels=dir.listFiles();

  接下來遍歷文件列表,獲取文件名便可獲取Action名字,以後就是反射的問題了,略,詳細代碼:apache

 1 package com.kdyzm.init;
 2 
 3 import java.io.File;
 4 import java.lang.reflect.Method;
 5 import java.net.URL;
 6 
 7 import org.springframework.context.ApplicationContext;
 8 import org.springframework.context.support.ClassPathXmlApplicationContext;
 9 import com.kdyzm.domain.security.Right;
10 import com.kdyzm.service.RightService;
11 public class InitRight {
12     public static void main(String[] args) throws Exception {
13         ApplicationContext context=new ClassPathXmlApplicationContext("spring/applicationContext.xml");
14         RightService rightService=(RightService) context.getBean("rightService");
15         
16 //        InitRight.class.getClassLoader();
17         URL url=ClassLoader.getSystemResource("com/kdyzm/struts/action");
18         File dir=new File(url.toURI());
19         File[] fiels=dir.listFiles();
20         for(File file:fiels){
21             if(file.getName().endsWith("class"))
22             processClass(file,rightService);
23         }
24         System.out.println("完成初始化任務!");
25     }
26     private static void processClass(File file, RightService rightService) throws Exception {
27         String basePackage="com.kdyzm.struts.action.";
28         String className=basePackage+file.getName().substring(0,file.getName().indexOf("."));
29         Class clazz=Class.forName(className);
30         Method[]methods=clazz.getDeclaredMethods();
31         String methodName="";
32         Class returnType=null;
33         Class[] parameters=null;
34         String url="";
35         for(Method method:methods){
36             methodName=method.getName();
37             returnType=method.getReturnType();
38             parameters=method.getParameterTypes();
39             if(returnType.equals(String.class)
40                     &&(parameters==null||parameters.length==0)){
41          url="/"+file.getName().substring(0,file.getName().indexOf("."))+"_"+methodName+".action";
42                 Right right=new Right();
43                 right.setRightUrl(url);
44                 rightService.saveOrUpateRight(right);
45             }
46         }
47     }
48 }

2、使用權限攔截器動態添加權限

  這是爲了方便在開發階段使用的方法,在實際使用的時候須要將該攔截器去掉。app

  這裏涉及到一個技術點,即如何獲取ApplicationConext對象,spring容器也在application做用域中,因此若是想要獲取ApplicationContext對象,必定要獲取ServletContext,經過WebApplicationContextUtils.getWebApplicationContext(ServletContext sc)方法就可以獲取ApplicationContext了。dom

 1 package com.kdyzm.struts.interceptors;
 2 
 3 import javax.servlet.ServletContext;
 4 
 5 import org.apache.struts2.ServletActionContext;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.web.context.support.WebApplicationContextUtils;
 8 
 9 import com.kdyzm.service.RightService;
10 import com.opensymphony.xwork2.ActionInvocation;
11 import com.opensymphony.xwork2.ActionProxy;
12 import com.opensymphony.xwork2.interceptor.Interceptor;
13 /**
14  * 該攔截在發佈以後應當刪除掉
15  * @author kdyzm
16  *
17  */
18 public class CatchUrlInterceptor implements Interceptor{
19     private static final long serialVersionUID = 6747245610234756713L;
20 
21     @Override
22     public void destroy() {
23         System.out.println("捕獲URL攔截器被銷燬!");
24     }
25 
26     @Override
27     public void init() {
28         System.out.println("捕獲URL攔截器初始化!");
29     }
30     @Override
31     public String intercept(ActionInvocation invocation) throws Exception {
32         ActionProxy actionProxy=invocation.getProxy();
33         String namespace=actionProxy.getNamespace();
34         String actionName=actionProxy.getActionName();
35         if(namespace==null||"/".equals(namespace)){
36             namespace="";
37         }
38         String url=namespace+"/"+actionName;
39         ServletContext sc=ServletActionContext.getServletContext();
40         ApplicationContext context=WebApplicationContextUtils.getWebApplicationContext(sc);
41         RightService rightService=(RightService) context.getBean("rightService");
42         rightService.appendRightByUrl(url+".action");
43         return invocation.invoke();
44     }
45 }

  struts.xml文件中的配置:ide

 1 <interceptors>
 2             <interceptor name="loginInterceptor" class="com.kdyzm.struts.interceptors.LoginInterceptor"></interceptor>
 3             <interceptor name="catchUrlInterceptor" class="com.kdyzm.struts.interceptors.CatchUrlInterceptor"></interceptor>
 4             <interceptor-stack name="surveyparkStack">
 5                 <interceptor-ref name="loginInterceptor"></interceptor-ref>
 6                 <!-- url捕獲攔截器應當放到登陸攔截器以後,完成項目以後應當將該攔截器拿掉 -->
 7                 <interceptor-ref name="catchUrlInterceptor"></interceptor-ref>
 9                 <interceptor-ref name="defaultStack">
11                     <param name="modelDriven.refreshModelBeforeResult">true</param>
12                 </interceptor-ref>
13             </interceptor-stack>
14         </interceptors>
15         <!-- 定義默認棧 -->
16         <default-interceptor-ref name="surveyparkStack"></default-interceptor-ref>

3、刪除權限和修改權限略

  修改權限和增長權限使用的是同一個頁面,對應的dao中的實現使用的是saveOrUpdate方法,其它略。url

相關文章
相關標籤/搜索