介绍
使用自定义参数解析器进行全局参数(用户信息UserInfo)注入,可以使用注解,也可以直接对象!
HandlerMethodArgumentResolver:处理函数参数的分解器,自定义需要实现这个接口(在SpringMVC中也可以使用)

接口方法
supportsParameter:用于判定是否需要处理该参数分解,必须返回true才会去调用下面的方法resolveArgument。(博主之前就是这个问题)   
resolveArgument:真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象 
实现
博主使用的是UserInfo对象注入(注解方式自行百度)
自定义参数解析器,实现HandlerMethodArgumentResolver接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
   | package com.bigbigsun.assets.admin.config;
  import cn.hutool.core.util.StrUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.jssdream.common.redis.RedisTemplateUtil; import com.jssdream.common.util.TokenUtil; import com.jssdream.common.util.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.stereotype.Service; 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.HttpServletRequest;
  /**  *   * 将登陆用户可以直接注入的形式获取  */ @Service public class UserArgumentResolver implements HandlerMethodArgumentResolver {     @Autowired     RedisTemplateUtil redisService;     @Override     public boolean supportsParameter(MethodParameter methodParameter) {         Class<?> clazz = methodParameter.getParameterType();         return clazz== User.class; 	//也可以 	/*return true; 	return parameter.hasParameterAnnotation(User.class);*/     }
      @Override     public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer,                                   NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) {         HttpServletRequest request = nativeWebRequest.getNativeRequest(HttpServletRequest.class);         //获取token         String token = TokenUtil.getToken(request);         User userInfo = StrUtil.isBlank(token) ? null : JSONObject.toJavaObject(JSON.parseObject(redisService.getKey(token)),User.class);         if(userInfo == null) {             return null;         }         return userInfo;     } }
 
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
   | package com.jssdream.admin.config;
  import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import java.util.List;
 
  @Configuration public class WebConfig extends WebMvcConfigurerAdapter {     @Autowired     UserArgumentResolver userArgumentResolver;
      @Override     public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {         argumentResolvers.add(userArgumentResolver);     }      }
 
   | 
 
Controller中使用用户信息
1 2 3 4 5
   | @RequestMapping("user") public User getUser(User user){         return user; }
  | 
 
最后
WebMvcConfigurerAdapter这个抽象类中的方法可以看一看,addInterceptors可以添加拦截器
1 2 3 4 5
   | @Override public void addInterceptors(InterceptorRegistry registry) {          // 拦截所有请求,进行判断     }
 
   |