前言
当我们将已登录用户信息通过唯一标识(比如:cookie 或者token)作为key保存在redis存储。我们后端很多接口都需要用户的这个唯一标识获取用户信息进行后续操作,但是每个接口都进行调取获得唯一标识的方法这样代码就太不简练优雅,我们可以通过WebMvcConfigurerAdapter(现已废弃使用WebMvcConfigurer) 结合 方法参数解析器(HandlerMethodArgumentResolver),在每个 接口带有特定参数的时候进行获取用户的唯一标识。
代码示例:
1.首先创建方法参数解析器 -UserArgumentResolver
import com.zcl.domain.User;
import com.zcl.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
UserService userService;
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> parameterType = methodParameter.getParameterType();
return parameterType == User.class; //方法中特有的参数 User user
}
@Nullable
@Override
public Object resolveArgument(MethodParameter methodParameter,
@Nullable ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest,
@Nullable WebDataBinderFactory webDataBinderFactory) throws Exception {
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class); //获得request对象
HttpServletResponse response = nativeWebRequest.getNativeResponse(HttpServletResponse.class); //获得response对象
/**start 以下就是自己的业务逻辑 根据自身业务可自由发挥 */
String paramToken = request.getParameter(UserService.COOKIE_NAME_TOKEN); //UserService.COOKIE_NAME_TOKEN 自定义的用户cookie标识常量
String cookieToken=getCookieValues(request,UserService.COOKIE_NAME_TOKEN); //UserService.COOKIE_NAME_TOKEN 自定义的用户cookie标识常量
//如果没有登录标识 则返回登页面
if(StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(cookieToken)){
return "login";
}
String token=StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
User user = userService.getByToken(response,token); //这个就是自己定义的通过唯一标识通过redis来获取用户信息的方法就不再详述。
return user; //返回获取的用户对象信息
/**end 以上就是自己的业务逻辑 根据自身业务可自由发挥 */
}
private String getCookieValues(HttpServletRequest request, String coookiNameToken) {
Cookie[] cookies = request.getCookies();
if (cookies == null || cookies.length <= 0 ) {
return null;
}
for (Cookie cookie : cookies){
if(cookie.getName().equals(coookiNameToken))
return cookie.getValue();
}
return null;
}
}
2.实现WebMvcConfigurer,添加自定义的方法参数解析器
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
UserArgumentResolver userArgumentResolver;
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
}
}
以上就是统一获取用户信息----唯一标识的全部代码
下面讲讲 WebMvcConfigurerAdapter 有兴趣的可以看看
什么是 WebMvcConfigurerAdapter?
WebMvcConfigurerAdapter配置类是spring提供的一种配置方式,采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置。 WebMvcConfigurerAdapter是一个抽象类,它只提供了一些空的接口让用户去重写,比如如果想添加拦截器的时候,需要去重写一下addInterceptors()这个方法,去配置自定义的拦截器。提供的接口
/*配置路径匹配参数*/
default void configurePathMatch(PathMatchConfigurer configurer) {}
/*配置Web Service或REST API设计中内容协商,即根据客户端的支持内容格式情况来封装响应消息体,如xml,json*/
default void configureContentNegotiation(ContentNegotiationConfigurer configurer) {}
/*配置路径匹配参数*/
default void configureAsyncSupport(AsyncSupportConfigurer configurer) {}
/* 使得springmvc在接口层支持异步*/
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {}
/* 注册参数转换和格式化器*/
default void addFormatters(FormatterRegistry registry) {}
/* 注册配置的拦截器*/
default void addInterceptors(InterceptorRegistry registry) {}
/* 自定义静态资源映射*/
default void addResourceHandlers(ResourceHandlerRegistry registry) {}
/* cors跨域访问*/
default void addCorsMappings(CorsRegistry registry) {}
/* 配置页面直接访问,不走接口*/
default void addViewControllers(ViewControllerRegistry registry) {}
/* 注册自定义的视图解析器*/
default void configureViewResolvers(ViewResolverRegistry registry) {}
/* 注册自定义控制器(controller)方法参数类型*/
default void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {}
/* 注册自定义控制器(controller)方法返回类型*/
default void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> returnValueHandlers) {}
/* 重载会覆盖掉spring mvc默认注册的多个HttpMessageConverter*/
default void configureMessageConverters(List<HttpMessageConverter<?>> converters) {}
/* 仅添加一个自定义的HttpMessageConverter,不覆盖默认注册的HttpMessageConverter*/
default void extendMessageConverters(List<HttpMessageConverter<?>> converters) {}
/* 注册异常处理*/
default void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}
/* 多个异常处理,可以重写次方法指定处理顺序等*/
default void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {}