SpringBoot自定义拦截器
SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。
DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。
SpringMVC的拦截器HandlerInterceptor接口对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,
postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。
在SpringBoot中使用拦截器首先需要实现HandlerInterceptor接口,然后将拦截器注册到MVC中,由MVC根据请求来执行不同的拦截器。
第一步:创建拦截器
package com.bjqdl.wzy.web.interceptors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.bjqdl.wzy.core.ThreadLocalMap;
import com.bjqdl.wzy.core.UserContext;
import com.bjqdl.wzy.util.AssertUtil;
import com.bjqdl.wzy.util.json.JSONUtil;
import com.bjqdl.wzy.web.entity.User;
import com.bjqdl.wzy.web.service.UserInfoService;
import com.bjqdl.wzy.web.utils.HttpUtils;
public class UserInfoInterceptor implements HandlerInterceptor{
private static final Logger logger = LoggerFactory.getLogger(UserInfoInterceptor.class);
private UserInfoService userInfoService;
public UserInfoInterceptor(UserInfoService userInfoService) {
super();
this.userInfoService = userInfoService;
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
logger.debug("UserInfoInterceptor.preHandle");
String openid = request.getParameter("openid");
if (request.getRequestURL().toString().contains("/user/")){
logger.debug("注册用户!");
return true;
}
if (!AssertUtil.isVal(openid)) {
logger.error("用户信息不完整,请在url后追加用户信息 url?openid=xxxx");
return false;
}
if (openid.equals(UserContext.getOpenID())) {
return true;
}
ThreadLocalMap.reset();
User user = this.userInfoService.getUser(openid);
if (AssertUtil.isVal(user)) {
ThreadLocalMap.put(UserContext.USER_CONTEXT, JSONUtil.parseJSON(user));
ThreadLocalMap.put(UserContext.USER_CONTEXT_IP, HttpUtils.getIpAddress(request));
return true;
} else {
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}第二步:注册到MVC中
自定义MVCConfig类,继承WebMvcConfigurerAdapter类,重现public void addInterceptors(InterceptorRegistry registry)方法,具体实现见代码
package com.bjqdl.wzy.web.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import com.bjqdl.wzy.web.interceptors.UserInfoInterceptor;
import com.bjqdl.wzy.web.service.UserInfoService;
@Configuration
public class MVCConfig extends WebMvcConfigurerAdapter {
@Autowired
private UserInfoService userInfoService;
/* (non-Javadoc)
* @see org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter#addInterceptors(org.springframework.web.servlet.config.annotation.InterceptorRegistry)
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new UserInfoInterceptor(userInfoService)).addPathPatterns("/**");
super.addInterceptors(registry);
}
}注意:
1、注解@Configuration是必备的;
2、addPathPatterns("/**");方法用于通知过滤器针对那些url进行拦截