SpringBoot——WebMvcConfigurer处理请求参数

参考文章: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";
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值