[AOP]java自定义登录切面;与outterLoop跳出多重循环

1. 定义一个注解

@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface LoginInfo {
    int[] role();
}

2. 先看在Cotroller层中注解的应用

@LoginInfo(role = {StatusConstants.CITY_ROLE})

比如定义了几个Role角色;

虽然用户表还是用权限表来返回一个权限的数组比较好;

然后 一般用2的次方来决定角色;2的0次方开始

也就是角色定义 用

public static final int ADMIN_ROLE= 1;
public static final int PROVINCE_ROLE= 2;
public static final int CITY_ROLE= 4;

大体上定义了三个角色;

3. 看切面的定义

QA: 如何获得切面的方法;

MethodSignature ms = (MethodSignature) point.getSignature();
Method method = ms.getMethod();
LoginInfo loginInfo = method.getAnnotation(LoginInfo.class);
@Aspect
@Component
@Slf4j
public class InfoAscept {

    @Pointcut(value = "@annotation(com.situdata.situciticpru.common.annotion.LoginInfo)")
    public void infoCut(){}

    @Before("infoCut()")
    public void before(JoinPoint point){
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        MethodSignature ms = (MethodSignature) point.getSignature();
        Method method = ms.getMethod();
        LoginInfo loginInfo = method.getAnnotation(LoginInfo.class);
        int[] roles = loginInfo.role(); //接口中定义的role列表
        HttpServletRequest request = servletRequestAttributes.getRequest();
        String authToken = request.getHeader("Token");
        if(StringUtils.isBlank(authToken)){
            throw new ResultException(RespCode.ERROR_2909, "");  //登录超时
        }
        Map<String,String> map = new HashMap<>();
        if(StringUtils.equals("xx",authToken)){
            validRole(new int[]{StatusConstants.ADMIN_ROLE}, roles);
            map.put("name","系统管理员");
            map.put("role",String.valueOf(StatusConstants.ADMIN_ROLE));
            map.put("username",StatusConstants.ACCOUNT_ADMIN);
        }else if(StringUtils.equals("xxx",authToken)){
            validRole(new int[]{StatusConstants.PROVINCE_ROLE}, roles);
            map.put("name","省管理员");
            map.put("role",String.valueOf(StatusConstants.PROVINCE_ROLE));
            map.put("username",StatusConstants.ACCOUNT_PROVINCE);
        }else if(StringUtils.equals("xxxx",authToken)){
            validRole(new int[]{StatusConstants.CITY_ROLE}, roles);
            map.put("name","市管理员");
            map.put("role",String.valueOf(StatusConstants.CITY_ROLE));
            map.put("username",StatusConstants.ACCOUNT_CITY);
        }else {
            throw new ResultException(RespCode.ERROR_2909, "");
        }
        SituThreadLocal.setUserInfo(map);
    }

    private void validRole(int[] hasRoles, int[] roles) {
        if(null == roles || roles.length == 0){
            return;
        }
        boolean hasRole = false;
        outterLoop: for (int m : hasRoles) {
            for (int n : roles) {
                if(m == n) {
                    hasRole = true;
                    break outterLoop;
                }
            }
        }
        if (!hasRole) throw new ResultException(RespCode.ERROR_2910, "");
    }
}

这就是很简单的一个登录切面方法;

直接就根据token来判断角色,然后返回给前端不同的角色和名字;

4. 关于otterLoop跳出

可以直接跳出外层循环;

不推荐使用;

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值