这个自定义注解的意义在于反射
当被自定义的注解标注后,被标注的方法或者类通过getMethod()反射方法就可以获知这个方法有没有被标注,一般作为一个系统的全局框架来使用,比如方法拦截上,登录权限拦截器这些。
package com.chuangqi.core.annotation;
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 Interceptor {
}
package com.chuangqi.interceptor;
import com.chuangqi.core.redis.RedisConstant;
import com.chuangqi.core.redis.RedisUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
/**
* 拦截器
*/
@Component
public class Interceptor extends HandlerInterceptorAdapter {
@Autowired
private RedisUtil redisUtil;
/**
* 拦截请求,如果返回true就放行,如果为false就停止
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
if (!(handler instanceof HandlerMethod)) {
return true;
}
HandlerMethod handlerMethod = (HandlerMethod) handler;
//判断方法上是否有拦截器注解
if (null == handlerMethod.getMethod().getAnnotation(com.chuangqi.core.annotation.Interceptor.class)) {
return true;
}
//判断用户id是否存在
if (redisUtil.exist(request.getHeader("user-id") + RedisConstant.USER_LOGIN)) {
System.out.println("用户存在");
return true;
} else {
System.out.println("用户不存在");
String result = "{\"code\":505,\"msg\":\"账号过期请重新登陆\"}";
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
response.setHeader("Access-Control-Allow-Methods", "*");
response.setHeader("Access-Control-Max-Age", "3600");
response.setHeader("Access-Control-Allow-Credentials", "true");
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print(result);
writer.flush();
writer.close();
}
return false;
}
}
上面的项目代码中,就是全局拦截方法,检测拦截的方法是否被@Interceptor
这个注解修饰,如果修饰了,就拦截下来,判断业务逻辑。