Struts2+Spring+AOP 权限拦截+反射获取Action权限注解

3 篇文章 0 订阅
1 篇文章 0 订阅

今天搞了一下Spring的AOP切面,作为权限判断。之后遇到一序列问题,,google+度娘一起上终于找到了

 

最先报错的是jar包~   CGLIB必须要导入否则 Spring代理你的Action类的时候会错

需要导入的jar包是

<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${org.springframework.version}</version>
		</dependency>
		
		<!--  -->
		<dependency>
		  <groupId>cglib</groupId>
		  <artifactId>cglib</artifactId>
		  <version>2.2.2</version>
		</dependency>
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjweaver</artifactId>
			<version>1.6.8</version>
</dependency>


 之后是添加Spring的切面

<aop:aspectj-autoproxy proxy-target-class="true"/>

添加的时候确定代理目标类

 

之后就是添加Struts2 中的配置了,交由Spring作为管理!

这两段都必须 ,否则Struts2 报错。

<constant name="struts.objectFactory" value="spring" />
<constant name="struts.objectFactory.spring.autoWire.alwaysRespect" value="true"/>

 

登陆Action  --- 无权限注解

@Action(value="userLogin",results={
			@Result(location="/default.jsp",type="redirect"),
			@Result(name=INPUT,location="/index.jsp",type="redirect",params={
					"message","${message}"
			})
	})
	public String userLogin() throws UnsupportedEncodingException{


获取菜单列表--- 权限注解

@Action(value="munuList",results=@Result(type="json"))
	@Permission(module="sysmanage",privilege="showMenu")
	public String menulist(){
		menuNodes = MenuNodes2Json.menuNode2Json(menuNodeService.getMenuNodes(),needUrl);
		return SUCCESS;
	}

 

 


最后就是编写切面了,只监听action,并在其中取消get和set方法

@Aspect	@Component
public class Interceptor {
	/**
	 * 定义切面
	 */
	@SuppressWarnings("unused")
	@Pointcut(" execution(java.lang.String edu.jmu.action..*.*()) && " + 
			  "!execution(java.lang.String edu.jmu.action..*.set*()) && " + 
			  "!execution(java.lang.String edu.jmu.action..*.get*())")
	private void intercepterMethod(){}
	
	@Around("intercepterMethod()")
	public Object doActionClassProfilling(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {	
		Object returnValue = null;
		Privilege privilege = GenericsUtils.getMethodPermission(proceedingJoinPoint.getTarget().getClass(),proceedingJoinPoint.getSignature().getName());
		//没有获得注解  及不需要权限-- 则直接运行
		if( privilege == null || "".equals(privilege)){
			System.out.println("not annotation:" + proceedingJoinPoint.getSignature().getName());
			
		}else{
			System.out.println(privilege.getModule() + "  " + privilege.getPrivilege());
		}
		returnValue = proceedingJoinPoint.proceed();
		return returnValue;
	}
}


 

 

 

工具类GenericsUtils,添加方法

@SuppressWarnings("rawtypes")
	public static Privilege getMethodPermission(Class clazz,String methodName) throws Exception{
		Method[] methods = clazz.getMethods();
		Privilege privilege = new Privilege();
		for(Method method : methods){
			if(methodName.equals(method.getName())){
				if(method.isAnnotationPresent(Permission.class)){
					Permission permission = method.getAnnotation(Permission.class);
					privilege.setModule(permission.module());
					privilege.setPrivilege(permission.privilege());
				}
				break;
			}
		}
		return privilege;
	}


 

 


到这一步还有没有问题,那就基本上搞定了

下面是控制台输出

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building this is a oa system 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> tomcat-maven-plugin:1.1:run (default-cli) @ oa >>>
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ oa ---
[debug] execute contextualize
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 4 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ oa ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] <<< tomcat-maven-plugin:1.1:run (default-cli) @ oa <<<
[INFO] 
[INFO] --- tomcat-maven-plugin:1.1:run (default-cli) @ oa ---
[INFO] Running war on http://localhost:8080/oa
[INFO] Using existing Tomcat server configuration at E:\Workspaces\MyEclipse 10\oa\target\tomcat
***

信息: Starting Coyote HTTP/1.1 on http-8080

not annotation:userLogin

Hibernate: select count(user0_.***=? and user0_.passWord=? limit ?
Hibernate: select user0_.***role5_.roleId where user0_.userName=?
Hibernate: select roles0_.userName as userName2_1_,***userName=?
sysmanage  showMenu


没有注解的登陆 ---   登陆的时候捕获到了,

有注解权限的展示列表-- Json载入列表的时候也捕获了,

并且 get和set方法未捕获

 

 

搞定。。。 收工~~~~~~

 

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值