package com.estate.expert.common.auth; import com.estate.expert.common.domain.Session; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebDataBinderFactory; import org.springframework.web.context.request.NativeWebRequest; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.method.support.ModelAndViewContainer; import java.util.Optional; /** * 会话解析器 */ public class SessionResolver implements HandlerMethodArgumentResolver { /** * 是否支持参数 * @param methodParameter 方法参数 * @return 是否支持 */ @Override public boolean supportsParameter(MethodParameter methodParameter) { return methodParameter.getParameterType().isAssignableFrom(Session.class); } /** * 解析参数 * @param parameter 方法参数 * @param mavContainer 模型视图容器 * @param webRequest 网络请求 * @param binderFactory 数据绑定工厂 * @return 参数 */ @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { // 为了兼容同时支持已登录和未登录都能访问的接口,这里初始化一个无数据对象避免 NPE return Optional.ofNullable(webRequest.getAttribute("_session_", RequestAttributes.SCOPE_REQUEST)).orElseGet(Session::new); } }