• springboot对传参的拦截统一处理


    在学习某网《java秒杀系统方案优化》的课程中,学到了一种springboot对传参的拦截统一处理的方式,特记录一下。

    如后台方法一般需要根据token从Session中获取User对象,如果不想在每个方法中都添加这段逻辑,而是直接获取User对象,可以怎么做呢?

    @RequestMapping("/to_list")
    public String list(Model model, User user) {...}
    第一步:创建一个WebConfig类,实现WebMvcConfigurer接口,重写public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {..}方法。
    第二步:创建一个UserArgumentResolver类,实现HandlerMethodArgumentResolver接口,重写supportsParameter和resolveArgument方法,这个类主要是对controller层
    的方法参数处理。supportsParameter方法表示对什么参数进行拦截,如需要对User参数进行拦截处理,可以对supportsParameter方法重写如下:
    public boolean supportsParameter(MethodParameter methodParameter) {
    Class<?> clazz = methodParameter.getParameterType();
    return User.class == clazz;
    }
    resolveArgument则是具体的组装User的逻辑,如根据token从redis中获取User对象,如下:
    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("token");
    String cookieToken = getCookieValue(request, "token");
    if (StringUtils.isEmpty(paramToken) && StringUtils.isEmpty(cookieToken)) {
    return null;
    }
    String token = StringUtils.isEmpty(paramToken)? cookieToken: paramToken;
    return userService.getByToken(response, token);
    }
    第三步:将上述自定义的参数处理器UserArgumentResolver的bean实例,添加到WebConfig进行处理,如下:

    @Autowired
    private UserArgumentResolver userArgumentResolver;

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
    resolvers.add(userArgumentResolver);
    }
    如上,就可以实现对token到User的统一拦截转换。
    另外,刚开始我用WebConfig继承WebMvcConfigurationSupport类,发现这样子的static下的静态资源无法加载,然后找到了WebMvcAutoConfiguration这springboot下的类,有个注解
    @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}),大致可以理解为这个webmvc自动配置类必须要在没有WebMvcConfigurationSupport的实例的时候生效。因此继承了
    WebMvcConfigurationSupport,导致默认配置失效,这也就解释了为什么js、css等静态资源无法加载问题。
  • 相关阅读:
    Linux数据库还原备份
    loadrunner遇到的问题
    Maven基础入门与核心知识
    数据去中心化的场景与流程
    设计模式:灵活编程(观察者模式)
    使用Mycat构建MySQL读写分离、主从复制、主从高可用
    设计模式:灵活编程(装饰模式)
    设计模式:灵活编程(组合模式)
    Laravel5:重定向 redirect 函数的详细使用
    设计模式:对象生成(单例、工厂、抽象工厂)
  • 原文地址:https://www.cnblogs.com/gujianzhe/p/10164370.html
Copyright © 2020-2023  润新知