DefaultSaTokenParseInterceptor.java 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package com.jtzx.crm.interceptor;
  2. import cc.uncarbon.framework.core.context.UserContext;
  3. import cc.uncarbon.framework.core.context.UserContextHolder;
  4. import cc.uncarbon.framework.web.util.IPUtil;
  5. import cn.dev33.satoken.session.SaSession;
  6. import cn.dev33.satoken.stp.StpUtil;
  7. import jakarta.servlet.http.HttpServletRequest;
  8. import jakarta.servlet.http.HttpServletResponse;
  9. import lombok.NonNull;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.web.servlet.AsyncHandlerInterceptor;
  12. import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
  13. /**
  14. * 从请求头解析并赋值到用户上下文,默认用于C端用户的鉴权
  15. * @author Uncarbon
  16. */
  17. @Slf4j
  18. public class DefaultSaTokenParseInterceptor implements AsyncHandlerInterceptor {
  19. @Override
  20. public boolean preHandle(@NonNull HttpServletRequest request, @NonNull HttpServletResponse response, @NonNull Object handler) {
  21. if (handler instanceof ResourceHttpRequestHandler) {
  22. // 直接放行静态资源
  23. return true;
  24. }
  25. // SA-Token 会自动从请求头中解析 token,所以这里可以直接拿到对应 session,从而取出业务字段
  26. if (StpUtil.isLogin()) {
  27. setContextsFromSaSession(StpUtil.getSession(), request);
  28. if (log.isDebugEnabled()) {
  29. log.debug("[SA-Token] 从请求头解析出用户上下文 >> {}", UserContextHolder.getUserContext());
  30. }
  31. } else {
  32. UserContextHolder.clear();
  33. }
  34. return true;
  35. }
  36. /**
  37. * 自 SaSession 更新当前线程用户、租户上下文
  38. *
  39. * @param session 会话对象
  40. * @param request ServletRequest 对象
  41. */
  42. public static void setContextsFromSaSession(SaSession session, HttpServletRequest request) {
  43. // 赋值用户上下文
  44. UserContext userContext = (UserContext) session.get(UserContext.CAMEL_NAME);
  45. // 获取用户公网IP
  46. // 先按逗号分隔后,再取第index个IP地址(从0开始);兼容启用了云防护盾CDN的服务器(可能获取到的IP会带上中间代理节点的IP地址)
  47. userContext.setClientIP(IPUtil.getClientIPAddress(request, 0));
  48. UserContextHolder.setUserContext(userContext);
  49. }
  50. }