接口拦截器实现

This commit is contained in:
xiongfeng
2022-06-17 17:58:53 +08:00
parent c975b10d0e
commit 9527c1064f
7 changed files with 162 additions and 102 deletions

View File

@@ -0,0 +1,20 @@
package cn.xf.basedemo.common.model;
import lombok.Data;
/**
* @program: xf-boot-base
* @ClassName LoginUserInfo
* @description:
* @author: xiongfeng
* @create: 2022-06-17 14:54
**/
@Data
public class LoginUserInfo {
private Integer id;
private String name;
private String phone;
}

View File

@@ -1,34 +0,0 @@
package cn.xf.basedemo.config;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @program: spring-boot-base-demo
* @ClassName TokenInterceptor
* @description:
* @author: xiongfeng
* @create: 2022-06-16 14:17
**/
public class TokenInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
//登录处理
String authorization = request.getHeader("Authorization");
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}

View File

@@ -1,5 +1,6 @@
package cn.xf.basedemo.config;
package cn.xf.basedemo.interceptor;
import cn.xf.basedemo.interceptor.TokenInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

View File

@@ -0,0 +1,43 @@
package cn.xf.basedemo.interceptor;
import cn.xf.basedemo.common.model.LoginUserInfo;
/**
* @program: xf-boot-base
* @ClassName SessionContext
* @description:
* @author: xiongfeng
* @create: 2022-06-17 15:03
**/
public class SessionContext {
private ThreadLocal<LoginUserInfo> threadLocal;
private SessionContext() {
this.threadLocal = new ThreadLocal<>();
}
/**
* 使用静态内部类创建单例
*/
private static class Context {
private static final SessionContext INSTANCE = new SessionContext();
}
public static SessionContext getInstance() {
return Context.INSTANCE;
}
public void set(LoginUserInfo user) {
this.threadLocal.set(user);
}
public LoginUserInfo get() {
return this.threadLocal.get();
}
public void clear() {
this.threadLocal.remove();
}
}

View File

@@ -0,0 +1,68 @@
package cn.xf.basedemo.interceptor;
import cn.xf.basedemo.common.model.LoginUserInfo;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @program: spring-boot-base-demo
* @ClassName TokenInterceptor
* @description:
* @author: xiongfeng
* @create: 2022-06-16 14:17
**/
public class TokenInterceptor implements HandlerInterceptor {
@Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private ObjectMapper objectMapper;
//不拦截的请求列表
private static final List<String> EXCLUDE_PATH_LIST = Arrays.asList("");
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
if(EXCLUDE_PATH_LIST.contains(requestURI)){
return true;
}
//登录处理
String token = request.getHeader("Authorization");
if(StringUtils.isEmpty(token))
token = request.getParameter("token");
String value = redisTemplate.opsForValue().get(token);
if(StringUtils.isEmpty(value)){
return false;
}
LoginUserInfo loginUserInfo = objectMapper.convertValue(value, LoginUserInfo.class);
if(loginUserInfo == null || loginUserInfo.getId() <= 0){
return false;
}
redisTemplate.expire(token, 86700, TimeUnit.SECONDS);
//用户信息设置到上下文
SessionContext.getInstance().set(loginUserInfo);
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}