Java实现获取当前请求用户信息

概述

实际开发过程中,除了业务开发之外,需要获取当前操作对象的用户信息,
实现这一业务需求,只需要再操作前,将上下文用户数据进行保存,
需要使用时,再从请求上下文中取出即可,主要步骤
1、用户正常登陆,登陆成功后,将用户信息、请求头等必要信息缓存在redis中
2、增加自定义拦截器,对所有业务请求进行拦截,校验用户身份权限等(登陆接口放行,不拦截)
3、在自定义拦截器中实现当前登录进来的用户写入request上下文
4、编写获取当前用户信息工具类,直接从上下文中获取用户信息即可
直接上核心部分处理代码,具体业务逻辑代码具体分析处理

自定义拦截类


/**
 * 自定义拦截器,对请求进行身份验证权限
 */
@Component
@Slf4j
public class AuthorizationInterceptor implements HandlerInterceptor {
	@Autowired
    private RedisTemplate redisTemplate;

	/**
     * @desc 拦截请求,处理
     **/
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        // 如果不是映射到方法直接通过
        if (!(handler instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) handler;
        Method method = handlerMethod.getMethod();
        //ClearAuth 免登录校验注解,有此注解方法直接放行
        boolean clearMethod = method.getAnnotation(ClearAuth.class) != null;
        if (clearMethod) {
            // 为了防止以恶意操作直接在REQUEST_CURRENT_KEY写入key,将其设为null
            request.setAttribute(SecurityConstant.REQUEST_CURRENT_USER, null);
            return true;
        }
        return hasPermission(request, response);
    }
    /**
     * 权限校验
     * 优先从header中取,兼容从参数获取
     *
     * @param request
     * @param response
     * @return
     */
    @SneakyThrows
	private boolean hasPermission(HttpServletRequest request, HttpServletResponse response) {
	    String sessionId = request.getHeader(SecurityConstant.TOKEN);
        if (StrUtil.isBlank(sessionId)) {
            sessionId = request.getParameter(SecurityConstant.TOKEN);
        }
        // 请求来源
        String from = request.getHeader(SecurityConstant.OLD_FROM);
        if (StrUtil.isBlank(from)) {
            from = request.getParameter(SecurityConstant.OLD_FROM);
        }
        if (StrUtil.isBlank(sessionId)) {
            return false;
        }
        String userInfoStr = null;
        switch (from) {
            case FROM_PC:
                userInfoStr = redisTemplate.get(SecurityConstant.PROJECT_PREFIX + sessionId);
                break;
            default:
                break;
	 	}  
	  	if (StrUtil.isBlank(userInfoStr )) {
            return false;
        }
        // 当前用户信息写入
        request.setAttribute(SecurityConstant.REQUEST_CURRENT_USER, userInfoStr );
        return true;
	}
}

免登陆注解

/**
 * 清除授权
 */
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface ClearAuth {

}

上下文工具类:WebUtil

public class WebUtil extends WebUtils {
	private static final Logger log = LoggerFactory.getLogger(WebUtil.class);
    public static final String USER_AGENT_HEADER = "user-agent";
    public static final String UN_KNOWN = "unknown";
    public WebUtil() {
    }
    public static String getUserInfoString(String key) {
        String result = null;
        RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
        HttpServletRequest httpServletRequest = requestAttributes == null ? null : ((ServletRequestAttributes)requestAttributes).getRequest();
        if (httpServletRequest != null) {
            Object userInfo = httpServletRequest.getAttribute(key);
            if (userInfo != null) {
                result = userInfo.toString();
            }
        }
        return result;
    }
     public static String getIP() {
        return getIP(getRequest());
    }
    @Nullable
    public static String getIP(HttpServletRequest request) {
        Assert.notNull(request, "HttpServletRequest is null");
        String ip = request.getHeader("X-Requested-For");
        if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("X-Forwarded-For");
        }
        if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_CLIENT_IP");
        }
        if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("HTTP_X_FORWARDED_FOR");
        }
        if (StringUtil.isBlank(ip) || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return StringUtil.isBlank(ip) ? null : ip.split(",")[0];
    }

}

当前用户工具类:UserUtil

/**
 * 用户工具类
 **/
@Slf4j
public class UserUtil {

    /**
     * 获取PC端用户信息
     *
     * @return
     */
    @SneakyThrows
    public static LoginUser getUser() {
        String resultStr = WebUtil.getUserInfoString(SecurityConstant.REQUEST_CURRENT_USER);
        AssertUtil.isTrue(StringUtil.isNotBlank(resultStr), CustomReturnEnum.LOGIN_NOT_EXIST);
        return LoginUser userDTO = JSONObject.parseObject(resultStr, LoginUser .class);
    }

}

业务使用

@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/test", produces = MediaType.APPLICATION_JSON_VALUE)
public class Test{

    /**
     * 业务
     *
     * @return
     */
    @GetMapping("/selectTest")
    public void selectTest() {
        LoginUser  loginUser =UserUtil.getUser();
         System.out.println(loginUser);
    }

}
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值