package com.inongfeng.shop.admin.interceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class WebAppConfig extends WebMvcConfigurerAdapter{ @Bean public UserSecurityInterceptor userSecurityInterceptor(){ return new UserSecurityInterceptor(); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userSecurityInterceptor()).addPathPatterns("/**").excludePathPatterns("/Login"); super.addInterceptors(registry); } }
preHandle:预处理回调方法,实现处理器的预处理(如登陆检查),第三个参数为响应的处理器 返回值: true表示继续流程(如调用下一个拦截器或处理器); false表示流程中断(如登陆检查失败),不会继续调用其余的拦截器或处理器,此时咱们须要经过response来产生响应;java
postHandle:后处理回调方法,实现处理器的后处理(但在渲染视图以前),此时咱们能够经过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。web
afterCompletion:整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中咱们能够在此记录结束时间并输出消耗时间,还能够进行一些资源清理,相似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。spring
在这里咱们只需实现preHandle方法便可实现简单拦截。session
package com.inongfeng.shop.admin.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import com.inongfeng.shop.admin.common.dt.Constants; import com.inongfeng.shop.admin.excepttion.LoginAuthException; @Component public class UserSecurityInterceptor implements HandlerInterceptor{ protected Logger logger = LoggerFactory.getLogger(getClass()); @Override public void afterCompletion(HttpServletRequest req,HttpServletResponse resp, Object arg2, Exception arg3)throws Exception { } @Override public void postHandle(HttpServletRequest req, HttpServletResponse resp,Object arg2, ModelAndView arg3) throws Exception { } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object arg2) throws Exception { HttpSession session = request.getSession(); if(StringUtils.isEmpty(session.getAttribute(Constants.SessionUserInfo))){ throw new LoginAuthException(Constants.E_LoginError_OR_TimeOut); } return true; } } }
上一步咱们抛出了登陆异常,可是还须要有地方去捕获这个异常。如下代码是一个全局捕获并处理异常的类。 若是捕获的是一个登陆异常,则返回让用户登陆。ide
package com.inongfeng.shop.admin.excepttion; import javax.servlet.http.HttpServletRequest; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; import com.inongfeng.shop.admin.common.dt.Constants; @ControllerAdvice public class GlobalExceptionHandler { protected Logger logger = LoggerFactory.getLogger(getClass()); @ExceptionHandler(value = BaseException.class) public Object baseErrorHandler(HttpServletRequest req, Exception e) throws Exception { if(e.getMessage().equals(Constants.E_LoginError_OR_TimeOut)){ if(logger.isDebugEnabled()){ e.printStackTrace(); logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {} ,登陆失败或超时", req.getRemoteHost(), req.getRequestURL(), e.getMessage()); } return "login"; }else{ logger.error("---BaseException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage()); } return e.getMessage(); } @ExceptionHandler(value = Exception.class) public Object defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception { if(logger.isDebugEnabled()){ logger.error("---DefaultException Handler---Host {} invokes url {} ERROR: {}", req.getRemoteHost(), req.getRequestURL(), e.getMessage()); } return e.getMessage(); } }