Spring拦截器流程
示例 - 登陆验证
- 编写Annotation, 用于标识不需要进行登陆验证的请求方法
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface LoginNotNeed { }
- 编写Interceptor
public class LoginInterceptor extends HandlerInterceptorAdapter { Logger logger = LoggerFactory.getLogger(LoginInterceptor.class); @SuppressWarnings("unchecked") @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); if (method.isAnnotationPresent(LoginNotNeed.class)) { return super.preHandle(request, response, handler); } else { HttpSession session = request.getSession(); Map<String, Object> loginUser = (Map<String, Object>) session.getAttribute(LoginEnum.LOGIN_USER.toString()); if (null == loginUser) { logger.debug("user isn't logged in."); request.setAttribute("msg", "LoginInterceptor - 错误提示: 用户未登录"); logger.debug("request.getRequestURI() = {} ", request.getRequestURI()); session.setAttribute(LoginEnum.LAST_REQUEST_URL_NO_LOGIN.toString(), request.getRequestURI().replaceFirst(request.getContextPath(), "")); request.getRequestDispatcher("/login").forward(request, response); return false; } else { return super.preHandle(request, response, handler); } } } }
- 配置interceptor
<!-- 登陆拦截器 --> <bean id="loginInterceptor" class="com.vserve.smartmedia.LoginInterceptor"></bean> <!-- 拦截器配置 --> <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <mvc:exclude-mapping path="/assets/**"/> <ref bean="loginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
- 使用示例
/** * 跳转到登陆页面 * @return */ @LoginNotNeed @RequestMapping("/login") public String toLogin() { return "/login"; } /** * 主页面 * @param req * @return */ @RequestMapping("/main") public String toMain(HttpServletRequest req) { return "/main"; }