在該系統中,我使用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 }
這是爲了方便在開發階段使用的方法,在實際使用的時候須要將該攔截器去掉。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>
修改權限和增長權限使用的是同一個頁面,對應的dao中的實現使用的是saveOrUpdate方法,其它略。url