配置文件
package com.itheima.config;
import com.itheima.controller.Interceptor;
import lombok.extern.slf4j.Slf4j;
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.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
/**
* @author ning
*/
@Slf4j
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Autowired
private Interceptor interceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//配置拦截器
registry.addInterceptor(interceptor)
.addPathPatterns("/**")//拦截所有路径
//放行的路径
.excludePathPatterns("/employee/login")
.excludePathPatterns("/employee/logout")
//图片上传有时候不会携带token
.excludePathPatterns("/common/upload");
}
/**
* 设置静态资源映射
*
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
log.info("开始进行静态资源映射...");
registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");
registry.addResourceHandler("/front/**").addResourceLocations("classpath:/front/");
registry.addResourceHandler("doc.html").addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
拦截器类,结合Threadlocal
package com.itheima.controller;
import com.itheima.common.TokenHolder;
import com.itheima.utils.JwtUtil;
import io.jsonwebtoken.Claims;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author ning
* @date 2022/6/12 15:24
*/
@Component
public class Interceptor implements HandlerInterceptor {
@Override
//原始方法调用前执行的内容
//返回值类型可以拦截控制的执行,true放行,false终止
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
//解析token是否有效
boolean b = JwtUtil.verifyToken(token);
if (b) {
Claims claims = JwtUtil.getClaims(token);
//解析token获得value值存入Threadlocal;
Object username = claims.get("username");
TokenHolder.setCurrentId((String) username);
return true;
}
return false;
}
}
ThreadLocal工具类
package com.itheima.common;
/**
* 基于ThreadLocal封装工具类,用户保存和获取当前登录用户id
*
* @author tongdulong@itcas.cn
*/
public class TokenHolder {
private static ThreadLocal<String> threadLocal = new ThreadLocal<>();
/**
* 设置值
*
* @param id id
*/
public static void setCurrentId(String id) {
threadLocal.set(id);
}
/**
* 获取值
*
* @return Long
*/
public static String getCurrentId() {
return threadLocal.get();
}
/**
* 删除值
*/
public static void removeCurrentId() {
threadLocal.remove();
}
}