参考文章:https://blog.csdn.net/weixin_43453386/article/details/83623242
什么是WebMvcConfigurer
Spring内部的一种配置方式,采用JavaBean的形式来代替传统xml配置文件形式,进行针对框架个性化定制;
常用的方法
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;
/** 添加拦截器 **/
void addInterceptors(InterceptorRegistry registry);
/** 这里配置视图解析器 **/
void configureViewResolvers(ViewResolverRegistry registry);
/** 配置内容裁决的一些选项 **/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 视图跳转控制器 **/
void addViewControllers(ViewControllerRegistry registry);
/** 静态资源处理 **/
void addResourceHandlers(ResourceHandlerRegistry registry);
/** 默认静态资源处理器 **/
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
使用addArgumentResolvers方法处理参数
可以看到下面的controller方法的参数显得非常复杂,为了不使得代码变得烦琐,项目中用到了WebMvcConfigurer接口中的addArgumentResolvers方法来处理参数。
@RequestMapping("/to_list")
public String list(Model model,HttpServletResponse response,
@CookieValue(value = MobileUserService.COOKI_NAME_TOKEN,required = false) String cookieToken,
@RequestParam(value = MobileUserService.COOKI_NAME_TOKEN,required = false) String paramToken){
if(StringUtils.isEmpty(cookieToken)&&StringUtils.isEmpty(paramToken)){
return "login";
}
//优先选择请求头中带的cookie,如果没有就选择url参数中带的
String token=StringUtils.isEmpty(cookieToken)?paramToken:cookieToken;
MobileUser user=mobileUserService.getByToken(response,token);
model.addAttribute("user",user);
return "goods_list";
其主要实现的功能就是从请求路径参数中或者是请求附带的cookie中拿到客户的登录凭证token,然后依据这个token去redis中查看这个用户是否登陆过。下来就使用addArgumentResolvers在配置中进行处理而不是在controller中
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
}
需要自定义一个参数处理器,通过addArgumentResolvers的add方法添加到SpringMVC中
@Service
//实现HandlerMethodArgumentResolver接口来自定义一个参数处理器
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
@Autowired
private MobileUserService mobileUserService;
@Autowired
private RedisService redisService;
//是否是符合要求的参数类型
@Override
public boolean supportsParameter(MethodParameter methodParameter) {
Class<?> clazz = methodParameter.getParameterType();
return clazz==MobileUser.class;
}
//处理参数
@Override
public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,
NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
//获取到请求对象和响应对象
HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response= nativeWebRequest.getNativeResponse(HttpServletResponse.class);
//获取请求中的token参数
String paramToken = request.getParameter(mobileUserService.COOKI_NAME_TOKEN);
//获取请求中的token(cookie)对象
String cookieToken=gerCookieValue(request,mobileUserService.COOKI_NAME_TOKEN);
String token=StringUtils.isEmpty(paramToken) ?cookieToken:paramToken;
return mobileUserService.getByToken(response,token);
}
//实现方式:遍历request请求中的cookie数组,看里面有没有token对象
private String gerCookieValue(HttpServletRequest request, String cookiNameToken) {
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if(cookie.getName().equals(cookiNameToken)){
return cookie.getValue();
}
}
return null;
}
}
将自定义参数处理器添加到web配置中
@Configurable
public class WebConfig implements WebMvcConfigurer {
@Autowired
private UserArgumentResolver userArgumentResolver;
//将参数处理器添加到springMVC中,以后的每个请求都会先经过检验,redis中是否有
//当前请求的对象,如果有则给请求中返回这个对象作为参数,否则返回null
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(userArgumentResolver);
}
}
然后再controller中只需判断传入的用户对象是否存再
@RequestMapping("/to_list")
public String list(Model model,MobileUser mobileUser){
if(mobileUser==null){
return "login";
}
model.addAttribute("user",mobileUser);
List<GoodsVo> goodsVoList = goodsService.getGoodsVoList();
model.addAttribute("goodsList",goodsVoList);
return "goods_list";