方法一样,只是把原来登陆和权限校验放在了AOP方法里。
用户权限是存放在session里的。
另外,如果登录时需要在注解里传入角色字段,可以用@Around("aopMethod() && @annotation(loginRequired)")实现。
其中,loginRequired是自定义的注解,如下:
package com.zp.haveplace.annotation;
import com.zp.haveplace.common.RoleConst;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解
* 有此注解的方法必须检查是否登录管理员,且是否具备value所指定的权限
* @author zp
* @date 2018/4/20
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginRequired {
String value() default RoleConst.ADMIN + "";//默认值为管理员权限
}
AOP部分代码
package com.zp.haveplace.aop;
import com.zp.haveplace.annotation.LoginRequired;
import com.zp.haveplace.bean.LoggerBean;
import com.zp.haveplace.bean.ResponseBean;
import com.zp.haveplace.common.ResponseBeanCode;
import com.zp.haveplace.common.ResponseBeanType;
import com.zp.haveplace.common.RoleConst;
import com.zp.haveplace.common.SessionConstant;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.net.ResponseCache;
/**
* 对有 @LoginRequired 注解的web方法检查是否登录,并检查是否具有value所指定的权限
* AOP方式
* @author zp
* @date 2018/4/20
*/
@Component
@Aspect
public class LoginRequiredAop {
/**
* 切入点
* 设置切入点为web层
* AspectJ支持命名切入点,方法必须是返回void类型
*/
@Pointcut("execution(* com.zp.haveplace.web..*.*(..))")
public void aopMethod(){}
/**
* 检查是否已经登录
* web层方法且方法上有 '@LoginRequired' 注解
* @param joinPoint
* @return
* @throws Throwable
*/
@Around("aopMethod() && @annotation(loginRequired)")
public Object around(ProceedingJoinPoint joinPoint, LoginRequired loginRequired) throws Throwable{
HttpServletRequest request = null;
for(Object arg:joinPoint.getArgs()){//遍历被通知方法的参数列表
if(arg instanceof HttpServletRequest){
request = (HttpServletRequest) arg;
}
}
// 没有找到request参数,无法检查权限
if(request == null){
LoggerBean.SYSTEM.error("检查权限时未找到HttpServletRequest参数,可能绑定失败");
return new ResponseBean().setErrorResponse("系统出现错误,检查权限时未找到HttpServletRequest参数");
}
// 检查登录
if(request.getSession().getAttribute(SessionConstant.LOGIN_ADMIN_ACCOUNT_SESSION_KEY) == null){
return new ResponseBean().setResponse(ResponseBeanType.ERROR,
ResponseBeanCode.NO_LOGIN,
"您未登录");
}
// 检查权限
Integer role = (Integer)request.getSession().getAttribute(SessionConstant.LOGIN_ADMIN_ROLE_SESSION_KEY);
if(role > Integer.valueOf(loginRequired.value())){
return new ResponseBean().setResponse(ResponseBeanType.ERROR,
ResponseBeanCode.NO_POWER,
"您没有权限,需要" +
RoleConst.ROLE_INFO[Integer.valueOf(loginRequired.value())] +
"权限");
}
return joinPoint.proceed();//执行目标方法
}
}