SpringAOP+自定义注解项目中的使用

如果你不曾了解请往下看

java里面实现自定义注解很简单,创建 @interface 起个名字,这个注解就创建完成了。额,但是怎么用呢?项目中如何去应用呢。废话不多说,上代码。

package com.example.test.dmo;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 校验用户是否有权限调用此接口
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodVerify {



}

通过SpringAOP+自定义注解去实现登陆权限的控制。@Target和@Retention两个注解是JAVA自带的元注解,自定义注解就用到了它,现在注解已经创建完成,现在要去通过AOP实现注解的处理。

package com.example.test.aop;

import com.example.test.dmo.MethodVerify;
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.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;

@Component
@Aspect
public class AopVerify {

    @Autowired
   private HttpServletRequest request;


    //切入点
    @Pointcut("within(com.example.test.controller..*)")
    public void interceptPoint(){

    }

    @Around("interceptPoint()")
    public Object interceptMessage(ProceedingJoinPoint pjp) throws Throwable {
        MethodSignature methodSignature=(MethodSignature)pjp.getSignature();
        Method method = methodSignature.getMethod();
        
        MethodVerify annotation = method.getAnnotation(MethodVerify.class);
        if(annotation!=null){
            Cookie[] cookies =request.getCookies();
            String loginName="";
            if(null!=cookies){
            for (Cookie c:cookies) {
                if("loginName".equals(c.getName())){
                    loginName= c.getValue();
                }
            }
            }
            if("".equals(loginName)||!"admin".equals(loginName)){
                String mess="需要登陆||需要超级管理员权限";
                return mess;
            }
        }
        Object proceed = pjp.proceed();
        return proceed;
    }
}

@Pointcut 切入点是controller的方法,通过@Around 环绕通知在调用被@MethodVerify注解的方法得到一个拦截。

        MethodSignature methodSignature=(MethodSignature)pjp.getSignature();
        Method method = methodSignature.getMethod();

        MethodVerify annotation = method.getAnnotation(MethodVerify.class);

通过此方法得到这个注解,只要是这个注解修饰的就进行认证,去判断此用户是否登陆或者为admin,不是就return 提示,是就pjp.proceed(),继续往下执行。

package com.example.test.controller;

import com.example.test.dmo.MethodVerify;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;


@Controller
@RequestMapping("app")
public class TestController {


    @RequestMapping("/login")
    @ResponseBody
    public Object login(String name, HttpServletResponse resp){
        Cookie cookie = new Cookie("loginName", name);
        cookie.setPath("/");
        cookie.setMaxAge(30);
        resp.addCookie(cookie);
        return "login success";
    }

    @RequestMapping("/aa")
    @ResponseBody
    @MethodVerify
    public Object aaa(){

        return "admin login success";
    }
}

在登陆接口设置cookie,通过@MethodVerify修饰的接口需要走环绕通知,下面是测试结果。
456登陆之后去访问aa接口
在这里插入图片描述
在这里插入图片描述
通过admin登陆之后
在这里插入图片描述
在这里插入图片描述
这样就实现了简单的权限认证,登陆认证

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值