SpringBoot秒杀系统:8.全局User对象注入

本文介绍了一种在每个接口自动获取并注入用户对象的方法,通过定义UserArgumentResolver实现HandlerMethodArgumentResolver接口,配合WebMvcConfigurerAdapter的addArgumentResolvers方法,避免了重复的token验证过程。

首先,前面利用token获取用户登录信息,并传输到页面。
如果每个接口都进行一次这样的操作将非常多余,
那么如何让每个接口自动的获取这个user对象呢?
通过ArgumentReslover参数解析器识别该对象,利用WebMvcConfigurerAdapter接口中addArgumentResolvers方法自动注入
参考:ArgumentReslover

  1. 定义Controller
    下面是前面在接口中通过cookie中的token找到的user对象
    @RequestMapping("/to_list")
    public String list(HttpServletResponse response, Model model,
					   @RequestParam(value=SeckillUserService.COOKI_NAME_TOKEN,required=false)String parmaToken,
					   @CookieValue(value=SeckillUserService.COOKI_NAME_TOKEN,required=false)String cookieToken) {
		if(StringUtils.isEmpty(parmaToken)&&StringUtils.isEmpty(cookieToken)){
			return "login";
		}
		//由于我们不知道请求可能传输cookie的方式,所以我们用两种都接收,,required=false为非必须
		String token = StringUtils.isEmpty(parmaToken)?cookieToken:parmaToken;
		SeckillUser user = seckillUserService.getByToken(response,token);
    	model.addAttribute("user", user);
        return "goods_list";
    }

我们的目的是直接注入这个user对象,而user对象通过全局获取

	@RequestMapping("/to_list")
	public String list(Model model,SeckillUser user){
		model.addAttribute("user",user);
		return "goods_list";
	}
  1. 定义参数控制器

ArgumentResolver

@Service
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    Logger log = LoggerFactory.getLogger(UserArgumentResolver.class);

    @Autowired
    SeckillUserService seckillUserService;

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        Class<?> clazz = methodParameter.getParameterType();
        return clazz == SeckillUser.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);

        String paramToken = request.getParameter(SeckillUserService.COOKI_NAME_TOKEN);
        String cookieToken = getCookieValue(request, SeckillUserService.COOKI_NAME_TOKEN);
        if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
            return null;
        }
        String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
        log.info(token);
        return seckillUserService.getByToken(response, token);

    }

    private String getCookieValue(HttpServletRequest request, String cookiName) {
        Cookie[]  cookies = request.getCookies();
        for(Cookie cookie : cookies) {
            if(cookie.getName().equals(cookiName)) {
                return cookie.getValue();
            }
        }
        return null;
    }
}

在配置容器中加入该ArgumentResolver

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Autowired
    UserArgumentResolver userArgumentResolver;
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(userArgumentResolver);
    }
}
  1. 测试
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值