通過添加註解@NeedLogin判斷請求是否需要登入
阿新 • • 發佈:2020-12-21
springmvc專案新增@NeedLogin註解判斷請求是否需要登入,所有添加註解的介面都需要登入後才能訪問。
新增@NeedLogin註解
1 /** 2 * 是否需要登入 3 * @author 4 */ 5 @Retention(RetentionPolicy.RUNTIME) 6 @Target({ElementType.METHOD, ElementType.TYPE}) 7 public @interface NeedLogin { 8 boolean value() default true;//是否需要登入 true 需要登入,false不需要登入 9 }
新增攔截器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>