在這篇筆記 《SpringMVC登錄驗證從有到無》中說明了如何通過SpringMVC去實現了登錄驗證功能。但是這種方式適用于后臺管理系統,在前臺應用中,有很多接口不需要登錄也可以訪問,如果要在攔截器中去一一判斷就顯得太麻煩不夠優雅了。
優雅的實現方式 —— 注解
1.創建注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface LoginCheck {
}
2.在Controller的方法上使用@LoginCkeck注解
@RequestMapping(value = "/toHome", method = RequestMethod.GET)
@LoginCheck
public String toHome() {
return "home";
}
3.在攔截器進行注解校驗
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
super.preHandle(request, response, handler);
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
if (method.isAnnotationPresent(LoginCheck.class)) {
// 使用@LoginCheck注解,則進行登錄驗證
HttpSession session = request.getSession();
User user = (User) session.getAttribute(Constans.USER);
if (user != null) {
return true;
}
// 不符合條件的跳轉到登錄界面
// response.sendRedirect("/mall-console/login.do");
// 解決重定向登錄界面在iframe頁面顯示不在top頁面顯示的問題
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<script>");
out.println("window.open('/mall-console/login.do', '_top')");
out.println("</script>");
out.println("</html>");
return false;
}
return true;
}
4.總結
不需要任何的url字符串的匹配,僅僅通過判斷方法是否使用@LoginCheck注解,是不是更加優雅?仔細看看,靜態資源的訪問問題也不存在了。