0%

获取Web原生对象与自定义参数解析

对于传统的Web开发常常需要使用equest对象,response对象,session对象等原生的Web对象。在SpringBoot和SpringMVC中也可以获取这些对象,但是通常我们不常直接使用这些对象。
本文记录了在SpringBoot下获取原生Web对象和使用自定义参数解析获取对象的方法

获取原生Web对象

获取原生对象的方法相当简单,只需要在Handler的参数列表中添加对应类型的参数即可
举例说明,如果我想获取Request、Response、Session,我可以这样获取

1
2
3
public ResponseResult getRequestAndResponse(HttpServletRequest request, HttpServletResponse response, HttpSession session){
System.out.println(request);
return new ResponseResult(200,"成功");

自定义参数解析

在SpringBoot中通常使用这种方法来获取Web对象。在这中方法中我们要做一下几点:

  1. 定义一个用来标识的自定义接口:
    接口上需要利用原生注解注明注解的作用范围+注解可以加上的位置
  2. 创建参数解析类:
    实现HandlerMethodArgumentResolver接口并重写其中的方法
  3. 创建配置类:
    将参数解析类对象传入resolvers.add()参数
  4. 在Handle方法中使用:
    直接在Handle方法的参数列表中加入在上一步中定义的注解后再写上接收的参数类型和变量名即可。

代码实现示例

  • 定义用来标识的注解

    1
    2
    3
    4
    5
    @Target(ElementType.PARAMETER)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface CurrentUserId {

    }
  • 实现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
    @Component
    public class UserIDArgumentResolver implements HandlerMethodArgumentResolver {

    //判断方法参数是否能使用当前的参数解析器进行解析
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
    //判断是否有xxx注解,传入自定义注解的类的字节码对象
    //此处:如果方法参数有 @CurrentUserID 就会被解析器解析。解析方法在下面
    return methodParameter.hasParameterAnnotation(CurrentUserID.class);
    }

    //进行参数解析的方法,可以在方法中获得对应数据,然后把数据作为返回值返回,方法返回值会赋值给对应方法参数
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
    //获取请求头中的token
    String token = nativeWebRequest.getHeader("token");
    if(StringUtils.hasText(token)){
    //解析token,获取UserID返回结果
    Claims claims = JwtUtil.parseJWT(token);
    String userID = claims.getSubject();
    //返回结果
    return userID;
    }
    return null;
    }
    }
  • 配置参数解析器(请使用IDEA插入需要重写的方法)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @Configuration
    public class ArgumentResolverConfig implements WebMvcConfigurer {

    @Autowired
    private UserIDArgumentResolver userIDArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    //目的是向 resolvers 这个集合添加自己定义好的 参数解析器 实现类对象
    resolvers.add(userIDArgumentResolver);
    }
    }
  • Handle方法中的使用:

    1
    2
    3
    4
    5
    @RequestMapping("/test")
    public ResponseResult test(@CurrentUserID String userID){
    System.out.println(userID);
    return new ResponseResult(200,users);
    }