spring boot中interceptor拦截器未生效的解决

这篇文章主要介绍了spring boot中interceptor拦截器未生效的解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

目录

interceptor拦截器未生效

开始用的spring boot版本为1.5.6

解决方

handlerinterceptor实现登录失效拦截

首先写一个实现handlerinterceptor的类

然后把这个拦截注册到spring中

interceptor拦截器未生效

搭建项目时发现拦截器未生效

开始用的spring boot版本为1.5.6

代码如下:

@Configuration public class WebConfig extends WebMvcConfigurerAdapter{ @Autowired private TimeInterceptor timeInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(this.timeInterceptor); super.addInterceptors(registry); } }

@Component public class RequestParamInfoIntorceptor extends handlerinterceptorAdapter { private Logger logger = LoggerFactory.getLogger(RequestParamInfoIntorceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { try { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; String beanName = handlerMethod.getBean().getClass().toString();//类 String methodName = handlerMethod.getmethod().getName();//方法名称 if(methodName.equals("error") || methodName.equals("success")) { return super.preHandle(request, response, handler); } String uri = request.getRequestURI();//请求路径 String remoteAddr = getIpAddr(request);//ip String method = request.getmethod(); //请求方式 Map pramMap = request.getParameterMap(); StringBuffer sbf = new StringBuffer(); int count = 0; String forCunt = ""; for(Map.Entry entry:pramMap.entrySet()){ forCunt = "[" + count + "]" + " : " ; sbf.append( "paramName" + forCunt + entry.getKey() + " - "+ "paramValue" + forCunt + request.getParameter(entry.getKey()) + "n"); count ++; } logger.info(" { beanName : " + beanName + " | " + "methodName : " + methodName + " | " + "uri : " + uri + " | " + "remoteAddr : " + remoteAddr + " | " + "requestMethod : " + method + "n" + "param : " + sbf + "}"); } } catch (Exception e) { //出错 logger.error(e.toString()); } return super.preHandle(request, response, handler); } //获取客户端IP private String getIpAddr(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unkNown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unkNown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unkNown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip; } }

开始以为是版本问题,后升级为2.1.1,WebConfig改为实现WebMvcConfigurer代码如下

@Configuration @Component public class WebConfig implements WebMvcConfigurer{ @Autowired private RequestParamInfoIntorceptor requestParamInfoIntorceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(this.requestParamInfoIntorceptor).addpathPatterns("/**"); } }

验证后还是不行,继续排查后发现,在添加版本控制时,有配置类继承了WebMvcConfigurationSupport,查询WebMvcConfigurationSupport源码发现其中有拦截注册方法addInterceptors(InterceptorRegistry registry),所以在版本控制配置类中重写此方法添加拦截器,拦截器生效,问题解决

解决方

代码如下:

@Configuration public class ApiConfig extends WebMvcConfigurationSupport { @Autowired private RequestParamInfoIntorceptor requestParamInfoIntorceptor; @Override protected void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(this.requestParamInfoIntorceptor).addpathPatterns("/**"); super.addInterceptors(registry); } }

handlerinterceptor实现登录失效拦截

首先写一个实现handlerinterceptor的类

代码如下:

public class SessionInterceptor implements handlerinterceptor { @Autowired Redistemplate redistemplate; //private static String LOGIN_CODE = "/user/no_loginPage?Landingcode=" + UserResourcesHelper.LANDINGCODE_106;// 登录地址及code信息 //private static String LOGIN_CODE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd11f95277f85e24b&redirect_uri=&response_type=code&scope=snsapi_userinfo&state=1234#wechat_redirect"; protected List patterns = new ArrayList(Arrays.asList(".*?/.*/no_.*?", "/", "/error")); public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 一些不需要过滤的方法 String url = request.getRequestURI(); if (isInclude(url) == true) return true; // 权限校验 Cookie cookie = getCookieByName(request, UserResourcesHelper.COOKIE_TOKEN_NAME); String user = null; if (cookie != null && !cookie.getValue().equals("")) { user = redistemplate.opsForValue().get(RedisKeyConstant.USER_WEB_TOKEN + cookie.getValue()); } if (cookie == null || user == null) {// 判断用户是否经过了授权 // 判断是否是AJAX访问 if (request.getHeader("x-requested-with") != null && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")) { response.setHeader("sessionstatus", "timeout"); response.setStatus(403); return false; } else { response.sendRedirect(request.getcontextpath()+"/home/no_index_toLoginSkip"); //response.sendRedirect(request.getcontextpath() +UserResourcesHelper.LOGIN_URL); // 非AJAX访问,页面跳转 //response.sendRedirect(request.getcontextpath() +"https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxd11f95277f85e24b&redirect_uri="+URLEncoder.encode("http://m.hobay.cn/user/no_loginPage", "utf-8")+"&response_type=code&scope=snsapi_base&state=123#wechat_redirect"); // 非AJAX访问,页面跳转 return false; } } return true; } @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 { } private boolean isInclude(String url) { for (String pattern : patterns) { if (Pattern.matches(pattern, url)) { return true; } } return false; } /** * 根据名字获取cookie * * @param request * @param name * cookie名字 * @return */ private static Cookie getCookieByName(HttpServletRequest request, String name) { Map cookieMap = ReadCookieMap(request); if (cookieMap.containsKey(name)) { Cookie cookie = (Cookie) cookieMap.get(name); return cookie; } else { return null; } } /** * 将cookie封装到Map里面 * * @param request * @return */ private static Map ReadCookieMap(HttpServletRequest request) { Map cookieMap = new HashMap(); Cookie[] cookies = request.getCookies(); if (null != cookies) { for (Cookie cookie : cookies) { cookieMap.put(cookie.getName(), cookie); } } return cookieMap; }

然后把这个拦截注册到spring中

代码如下:

@EnableWebMvc @Configuration public class WebConfig extends WebMvcConfigurerAdapter{ @Bean SessionInterceptor sessioninterceptor() { return new SessionInterceptor(); } /** * 配置拦截器 * @author yuqingquan * @param registry */ public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(sessioninterceptor()); }

相关文章

HashMap是Java中最常用的集合类框架,也是Java语言中非常典型...
在EffectiveJava中的第 36条中建议 用 EnumSet 替代位字段,...
介绍 注解是JDK1.5版本开始引入的一个特性,用于对代码进行说...
介绍 LinkedList同时实现了List接口和Deque接口,也就是说它...
介绍 TreeSet和TreeMap在Java里有着相同的实现,前者仅仅是对...
HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进...