1.
-
拦截器
import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.io.PrintWriter; import java.util.HashMap; import java.util.Map; import java.util.Objects; import java.util.concurrent.TimeUnit; /** * 登录拦截器 * * @author sheng_zs@126.com * @date 2021-07-17 12:18 */ @Slf4j @Component public class LoginInterceptor implements HandlerInterceptor { @Resource private RedisTemplate<String, Object> redisTemplate; @Resource private ValueOperations<String, Object> valueOperations; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { /* attention:简单跨域就是GET,HEAD和POST请求,但是POST请求的"Content-Type"只能是application/x-www-form-urlencoded, multipart/form-data 或 text/plain 反之,就是非简单跨域,此跨域有一个预检机制,说直白点,就是会发两次请求,一次OPTIONS请求,一次真正的请求 */ if (Objects.equals("OPTIONS", request.getMethod())) { return true; } Map<String, Object> errorMap = new HashMap<>(); errorMap.put("message", "登录过期"); errorMap.put("status", "302"); errorMap.put("reLogin", "1"); // 获取用户id,判断 redis 中是否已经过期 String loginUserId = request.getHeader("loginUserId"); if (loginUserId == null || "".equals(loginUserId)) { HttpSession session = request.getSession(); loginUserId = session.getAttribute("userId") != null ? session.getAttribute("userId").toString() : ""; } if (loginUserId == null || "".equals(loginUserId)) { returnJson(response, errorMap); return false; } Long expire = redisTemplate.getExpire("loginUserId:" + loginUserId); // 登录时间未过期 if (Objects.nonNull(expire) && expire > -2) { valueOperations.set("loginUserId:" + loginUserId, loginUserId, 30, TimeUnit.MINUTES); return true; } returnJson(response, errorMap); return false; } private void returnJson(HttpServletResponse response, Object json) { response.setCharacterEncoding("UTF-8"); response.setContentType("application/json; charset=utf-8"); try (PrintWriter writer = response.getWriter()) { writer.print(json); } catch (IOException e) { e.printStackTrace(); } } }
-
拦截器注册
import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.annotation.Resource; /** * 登录拦截器配置类 * * @author sheng_zs@126.com * @date 2021-07-17 12:21 */ @Configuration public class LoginInterceptorConfig implements WebMvcConfigurer { @Resource private LoginInterceptor loginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistration registration = registry.addInterceptor(loginInterceptor); // 设置顺序,也可在 拦截器上 用 @Order() 注解 registration.order(1); // 拦截所有的方法 registration.addPathPatterns("/**"); // 不拦截登录相关方法 registration.excludePathPatterns("/login/**") // 不拦截微信相关方法 .excludePathPatterns("/wx/**") // 不拦截 swagger 相关资源 .excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**"); } }