springboot使⽤注解⽅式aop,获取注解参数,处理request和response springboot aop使⽤注解,获取注解参数,处理request和response
这⾥实现⼀个简单的登陆判断注解
加了LonginAction的⽅法必须登陆才能执⾏
1
⾸先检查是否导⼊相关springboot aop启动器依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
2 创建切点注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginAction {
String value() default "";
}
2 创建切⾯类
这⾥只作web访问时的简单演⽰
@Component
@Aspect
public class UserAspect {
//配置切点
@Pointcut("@annotation(com.ji.LoginAction)")
public void LoginAction(){};
@Around("LoginAction()")
public Object toLogin(ProceedingJoinPoint pjp) throws Throwable {
//获取request和response
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestAttributes();
HttpServletRequest request = Request();
HttpServletResponse response = Response();
String requestURI = RequestURI();
MethodSignature signature = (MethodSignature) Signature();
LoginAction annotation = Method().getAnnotation(LoginAction.class);
if (dLogin()){
//这⾥可以对需要登陆的接⼝进⾏是否登陆的判断,具体操作这⾥省略,这⾥默认没有登陆,根据项⽬来进⾏编写,也可以加⼊其他注解参数
//            Session().getAttribute("userId");
response.sendRedirect("/login.html");
System.out.println("该接⼝需要登陆");
//            throw new RuntimeException("该接⼝需要登陆");
return null;
}else {
System.out.println("该接⼝不需要登陆");
//执⾏controller⽅法,o为该⽅法的返回值,也可以对返回值进⾏处理
Object o = pjp.proceed();
System.out.println("接⼝访问成功");
//这⾥测试对String类型处理
o+="-----deal------";
return o;
}
}
}
使⽤@Around环绕能阻⽌controller⽅法执⾏,@Before也能阻⽌⽅法执⾏,只不过需要⼿动抛出异常来进⾏阻⽌
还要说明⼀点,这⾥⾃定义注解只加了⼀个needLogin参数,可以结合具体项⽬加⼊更多参数来进⾏判断,获取参数值⽅法同needLogin值的获取
3 创建测试controller
@RequestMapping("test")
@LoginAction(needLogin = false)
public String test(String name){
System.out.println("controller");
return "success    "+"欢迎"+name;
}
springboot aop@RequestMapping("test1")
@LoginAction(needLogin = true)
public String test1(){
System.out.println("需要登陆的接⼝");
return null;
}
@RequestMapping("test2")
public String test2(){
System.out.println("没有添加注解的登陆的接⼝");
return null;
}
3 进⾏测试
1 (test)有LoginAction注解并且value值为false
可以看出来在Around⽅法⾥对返回值进⾏了处理
控制台信息
2 (test1)有LoginAction注解并且value值为true
这⾥访问被后台判断跳转到登陆页⾯,没有执⾏controller⽅法
控制台信息
2 (test2)没有LoginAction注解
没有加LoginAction注解的正常访问

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。