在这篇笔记 《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注解,是不是更加优雅?仔细看看,静态资源的访问问题也不存在了。