springmvc项目添加@NeedLogin注解判断请求是否需要登录,所有添加注解的接口都需要登录后才能访问。
添加@NeedLogin注解
/**
* 是否需要登录
* @author
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
public @interface NeedLogin {
boolean value() default true;//是否需要登录 true 需要登录,false不需要登录
}
添加拦截器CheckLoginInterceptor
/** * 需要登录 * @author*/
public class CheckLoginInterceptor extends HandlerInterceptorAdapter {
private static final Logger log = LoggerFactory.getLogger(CheckLoginInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
if (handler instanceof HandlerMethod) {
HandlerMethod method = (HandlerMethod) handler;
// 获取类和方法上的是否需要登录注解
NeedLogin loginController = method.getClass().getAnnotation(NeedLogin.class);
NeedLogin needLoginMehtod = method.getMethodAnnotation(NeedLogin.class);
// 类和方法上都无需要登录注解
if (!(loginController != null && loginController.value()) && !(needLoginMehtod != null && needLoginMehtod.value())){
return true;
}
//该方法需要校验是否登录 //获取用户信息
UserInfo userInfo = 获取用户信息;
if (userInfo != null) {
return true;
}
log.info("未登录访问需要登录的请求 {}", request.getRequestURI());
// 获取类和方法上的是否需要responseBody注解
RestController restController = method.getBean().getClass().getAnnotation(RestController.class);
ResponseBody ResponseBodyController = method.getBean().getClass().getAnnotation(ResponseBody.class);
ResponseBody responseBodyMethod = method.getMethodAnnotation(ResponseBody.class);
// 是否接口方法
Boolean isApi = false;
if(restController != null || responseBodyMethod != null || ResponseBodyController != null){
isApi = true;
}
if (!isApi) {
// 用户为空,重定向去登录
// todo 跳转登录页return false;
}
// 请求接口,直接返回响应数据
response.reset();
//设置编码格式
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.write(JSON.toJSONString(Result.error(ErrorCodeEnum.ERR_20003)));
pw.flush();
pw.close();
return false;
}
return true;
}
}
配置拦截器
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.common.interceptor.CheckLoginInterceptor"></bean>
</mvc:interceptor>