WebMvcConfigurer中addArgumentResolvers方法的使用

在Springboot中的WebMvcConfigurer接口在Web开发中经常被使用,例如配置拦截器、配置ViewController、配置Cors跨域等。本文主要讲解另一个方法:addArgumentResolvers()在实例中的应用。

一、方法作用
该方法可以用在对于Controller中方法参数传入之前对该参数进行处理。然后将处理好的参数在传给Controller中的方法。

官方API文档解释:添加解析器以支持自定义控制器方法参数类型。

这不会覆盖对解析处理程序方法参数的内置支持。要自定义对参数解析的内置支持,请RequestMappingHandlerAdapter直接配置。

二、场景描述
在权限场景中,通常会有要求用户登录之后才能访问的场景。对于这些问题可以多种解决方案,如:使用Cookie+Session的会话控制、使用拦截器、使用SpringSecurity或shiro等权限管理框架等。

这里使用Cookie+Session处理。处理的逻辑为:

用户第一次登录之后会得到一个cookie,在以后每次的访问过程中都会携带Cookie进行访问。在后台的Controller中对于需要登录权限的访问接口都要先获取Cookie中的Token,再使用Token从session中获取用户登录信息来判断用户登录情况决定是否放行。

三、存在问题
如果在每个需要登录权限访问的方法中都要写这个逻辑就会使代码重复,出现了冗余。代码基本如下:

@GetMapping("goods")
public Result showGoods1(HttpSession session, @CookieValue("Token") String token){
    // 你每次都要在这里判断token或session
    if (token == null || MyObjectUtil.isEmpty(session.getAttribute(token))){
        return Result.error();
    }
    return Result.ok();
}

所以需要寻找是否有更好的解决方法。

最终找到addArgumentResolvers()这个方法。只需要在这个方法中进行处理即可。

四、问题解决
该方法的处理流程如下:

代码如下:

Controller中的方法

@GetMapping("goods")
public Result showGoods(User user){
    // 注意:这里的User参数不是由前端传入的,而是由addArgumentResolvers方法处理之后传进来的
    log.info(user.toString());
    // 根据处理之后传入的参数判断是否登录
    if (user == null)
        return Result.error();
    return Result.ok();
}

WebMvcController实现了类

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Autowired
    private UserArgumentResolver userArgumentResolver;

    /**
     * 该方法作用在调用Controller方法的参数传入之前
     * @param resolvers
     */
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        // userArgumentResolver该类对Controller传入的参数做了具体处理
        resolvers.add(UserArgumentResolver);
    }
		
    // 其他配置
}

UserArgumentResolver自定义实现类

/**
 * 该类用于WebConfig配置类的addArgumentResolvers方法传入
 */
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {
    /**
     * 该方法用于判断Controller中方法参数中是否有符合条件的参数:
     *                          有则进入下一个方法resolveArgument;
     *                          没有则跳过不做处理
     * @param parameter
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        // 获取传入参数的类型
        Class<?> type = parameter.getParameterType();
        // 如果参数类型有为User类的则符合,进入resolveArgument方法
        if (User.class == type)
            return true;
        return false;
    }

    /**
     * 该方法在上一个方法同通过之后调用:
     *      在这里可以进行处理,根据情况返回对象——返回的对象将被赋值到Controller的方法的参数中
     * @param parameter
     * @param mavContainer
     * @param webRequest
     * @param binderFactory
     * @return
     * @throws Exception
     */
    @Override
    public Object resolveArgument(
        MethodParameter parameter, 
        ModelAndViewContainer mavContainer, 
        NativeWebRequest webRequest, 
        WebDataBinderFactory binderFactory
    ) throws Exception {
        HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
        HttpSession session = request.getSession();
        // 获取cookie
        Cookie[] cookies = request.getCookies();
        String token = null;
        for (Cookie c : cookies){
            if (c.getName().equals("token")){
                token = c.getValue();
                break;
            }
        }
        // 如果token不存在,则返回null
        if (token == null) return null;
        // 获取session中对象
        User user = (User)session.getAttribute(token);
        return user;
    }
}

原文链接:WebMvcConfigurer中addArgumentResolvers方法的使用

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: addargumentresolvers是Spring MVC框架的一个方法,用于向控制器添加自定义参数解析器。通过添加自定义参数解析器,可以将请求的参数转换为控制器方法的参数类型,从而实现更加灵活的参数处理。这个方法可以在WebMvcConfigurer接口重写。 ### 回答2: 在Spring MVCaddArgumentResolvers方法是用来注册自定义的方法参数解析器的。方法参数解析器的作用是将请求参数转换成控制器方法所需要的参数类型。 当我们在开发Web应用时,通常会有一些特定的需求,比如需要自定义一种参数类型的解析方式。这时我们可以通过实现HandlerMethodArgumentResolver接口来自定义参数解析器,并通过addArgumentResolvers方法将其注册到Spring MVC框架。 我们可以通过重写HandlerMethodArgumentResolver接口的两个方法来实现自定义参数解析器: 1. supportsParameter方法:判断当前解析器是否支持指定的参数类型。在这个方法,我们可以根据参数的类型或注解等信息来决定是否能够解析该参数类型。 2. resolveArgument方法:实现参数解析的具体逻辑。在这个方法,我们可以根据请求参数的值,将其转换成对应的参数类型,并返回给控制器方法使用。 当我们调用addArgumentResolvers方法时,传入我们自定义的参数解析器对象,Spring MVC框架会将其注册到解析器链。当有请求到达时,框架会遍历解析器链,找到支持当前参数类型的解析器,并调用其resolveArgument方法来解析参数。 通过addArgumentResolvers方法注册自定义参数解析器,可以让我们更加灵活地处理请求参数,满足特定的业务需求。这样,我们就可以根据自己的需要来实现对不同类型的参数进行解析,从而提高开发效率和灵活性。 ### 回答3: addArgumentResolvers是一个方法或者函数,用于向Spring MVC或Spring WebFlux配置添加自定义的参数解析器。 参数解析器是用于将HTTP请求的参数解析为Controller方法的参数对象的组件。默认情况下,Spring MVC或Spring WebFlux提供了一些内置的参数解析器,例如RequestParamResolver用于解析@RequestParam注解修饰的参数,PathVariableResolver用于解析@PathVariable注解修饰的参数等。 但是有时候,我们可能需要自定义的参数解析逻辑,例如将请求的特定参数通过某种方式转换为对象。这时就可以使用addArgumentResolvers来添加自定义的参数解析器。 addArgumentResolvers接收一个或多个参数解析器对象作为参数,可以是自定义的参数解析器实现类的实例,也可以是已经注册到Spring IoC容器的Bean对象。这些参数解析器会按照添加的顺序依次被应用于解析请求的参数。 当收到一个请求时,Spring MVC或Spring WebFlux会遍历已注册的参数解析器列表,尝试使用每个参数解析器来解析该请求的参数。如果某个参数解析器支持解析该参数,则会将解析结果传递给Controller方法,作为方法的参数对象。如果没有找到合适的参数解析器,则会抛出异常或者返回错误信息给客户端。 通过使用addArgumentResolvers添加自定义的参数解析器,我们可以灵活地扩展Spring MVC或Spring WebFlux框架的功能,以应对不同的业务需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值