如果你不曾了解请往下看
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登陆之后
这样就实现了简单的权限认证,登陆认证