前言:因为在javaweb的项目中需要对所有接口进行拦截,比如登录的时候,就需要判断如果没有登录过就不让访问该接口。
1,新建InterceptorConfig并实现WebMvcConfigurer接口
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.WebMvcConfigurer;
/**
* 拦截器配置类
*/@ Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Bean
public Interceptor initAuthInterceptor() {
return new Interceptor();
}
@ Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(initAuthInterceptor())
//.addPathPatterns("/**")
.addPathPatterns("/tree")
.excludePathPatterns("/login/**")
.excludePathPatterns("/login")
.excludePathPatterns("/swagger-ui.html")
.excludePathPatterns("/configuration/ui")
.excludePathPatterns("/swagger-resources")
.excludePathPatterns("/configuration/security")
.excludePathPatterns("/v2/api-docs")
.excludePathPatterns("/error")
.excludePathPatterns("/webjars/**")
.excludePathPatterns("/**/favicon.ico");
}
}
2,新建Interceptor并且实现HandlerInterceptor接口
import org. slf4j .Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core. Redis Template;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.concurrent.TimeUnit;
/**
* 拦截器
*/public class Interceptor implements HandlerInterceptor {
private final static String TEST_TOKEN = "123456";
private static Logger logger = LoggerFactory.getLogger(Interceptor.class);
@Autowired
private RedisTemplate<String, String> redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
//从Header中获取token
String tokenFromHeader = request.getHeader("token");
logger.info("拦截器获取到token为:" + tokenFromHeader);
if (StringUtils.isEmpty(tokenFromHeader)) {
response.getWriter().print("未提供token");
return false;
}
//直接放行测试用的uid和token
if (tokenFromHeader.equals(TEST_TOKEN)) {
return true;
}
//从redis中通过用户信息获取token
String user = (String) redisTemplate.opsForValue().get(tokenFromHeader);
if (StringUtils.isEmpty(user)) {
response.getWriter().print("未登录");
return false;
} else {
// 如果存在token,则重置token的过期时间
redisTemplate.expire(tokenFromHeader, Constant.EXPIRE_TIME, TimeUnit.MINUTES);
}
return true;
}
}