1.自定义拦截器
package com.peak.security.handler;
import com.peak.common.Constants;
import com.peak.mapper.user.UserTokenMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.security.auth.message.AuthException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @ClassName: TokenInterceptorHander
* @Description: 判断token拦截器
* @Author: jql
* @Date: 2020/5/15 9:55
* @Version: 1.0
*/
@Component
public class TokenInterceptorHander extends HandlerInterceptorAdapter {
@Autowired
private UserTokenMapper userTokenMapper;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取用户凭证
String token = request.getHeader(Constants.TOKEN_NAME);
if(StringUtils.isEmpty(token)) {
throw new AuthException(Constants.TOKEN_NAME + "不能为空");
}
//查看token是否有效
return true;
}
}
2.将拦截器加入到springBoot中
package com.peak.common.core.configurer;
import com.peak.security.handler.TokenInterceptorHander;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
/**
* @ClassName: WebConfig
* @Description: 自定义拦截器
* @Author: jql
* @Date: 2020/5/15 10:50
* @Version: 1.0
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Resource
private TokenInterceptorHander tokenInterceptorHander;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//添加白名单
List<String> patterns = new ArrayList<>();
patterns.add("/login");
patterns.add("/swagger*/**");
patterns.add("/webjars/**");
patterns.add("/getVerify");
// 自定义拦截器,添加拦截路径和排除拦截路径
registry.addInterceptor(tokenInterceptorHander).addPathPatterns("/**").excludePathPatterns(patterns);
}
}
问题:
1.自定义的拦截器不起作用
如果引入包存在继承WebMvcConfigurationSupport的拦截器,那么在项目中再去实现implements WebMvcConfigurer接口就会出现拦截器无法加载的问题
解决办法:
将拦截器也继承WebMvcConfigurationSupport
但问题又来了,因为一但继承WebMvcConfigurationSupport类后,springBoot的webMVC自动配置失效了。表现为:访问不了js/css/html等静态资源。
所以在最后解决办法不在继承WebMvcConfigurationSupport,改为是实现WebMvcConfigurer。具体实现看上面代码。
分析原因:
在spring boot的自定义配置类继承 WebMvcConfigurationSupport 后,发现自动配置的静态资源路径(classpath:/META/resources/,classpath:/resources/,classpath:/static/,classpath:/public/)不生效。
看下自动配置类的定义:
可以看出springBoot 自动配置类 WebMvcAutoConfiguration 上有条件注解:
@ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
这个注解的意思是在项目类路径中缺少WebMvcConfigurationSupport类型的bean时改自动配置类才会生效,所以继承 WebMvcConfigurationSupport 后需要自己再重写相应的方法。
如果想要使用自动配置生效,又要按自己的需要重写某些方法,比如增加 viewController ,则可以自己的配置类可以继承 WebMvcConfigurerAdapter 这个类。不过在spring5.0版本后这个类被丢弃了 WebMvcConfigurerAdapter ,虽然还可以用,但是看起来不好。
所以最终选择实现WebMvcConfigurer。
参考:https://www.cnblogs.com/deng720/p/8989388.html