在学习某网《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等静态资源无法加载问题。

springboot对传参的拦截统一处理的更多相关文章

  1. Docker 如何动态给SpringBoot项目传参

    关于SpringBoot配置数据源 在项目开发中,我们往往需要配置多套不同的配置环境例如:本地开发.测试环境.部署环境.每一个环境的数据源配置可能都不同,因此需要写不同的数据源配置.如果用Docker ...

  2. springboot前端传参date类型后台处理方式

    转载:https://blog.csdn.net/xiangluer/article/details/81913137?utm_source=copy 参考如下博客: https://www.jian ...

  3. SpringBoot枚举传参

    创建一个接口所有枚举继承 package com.gecko.charging.common; public interface BaseEnum { Integer getCode(); } 具体的 ...

  4. springboot controller传参,对象映射

    Post请求,对象映射时,在参数 加 @RequestBody: 传入对象内字段的json才能映射 {"legendData": [100,90,80,70,60,50,40,30 ...

  5. vue 路由传参

      mode:路由的形式 用的哪种路由 1.hash 路由 会带#号的哈希值 默认是hash路由   2.history路由 不会带#的     单页面开发首屏加载慢怎么解决?单页面开发首屏加载白屏怎 ...

  6. SpringBoot系列: Java应用程序传参和SpringBoot参数文件

    ===========================向java 程序传参的几种形式:===========================1. 使用 OS 环境变量. 这个不推荐. 2. 使用JVM ...

  7. SpringBoot 2.x (2):请求和传参

    其实请求和传参这些知识属于SpringMVC 不过这也属于必须掌握的知识,巩固基础吧 GET请求: 以第一篇文章自动的方式创建SpringBoot项目: 然后新建Controller: package ...

  8. SpringBoot传参转换枚举

    有时候,我们传参的时候,希望使用枚举类来当作参数 public enum VipEnum { HUANG(1, "黄钻"), HONG(2, "红钻"); pr ...

  9. SpringBoot传参方式

    地址传参 1.创建一个Action类 package com.lion.action; import org.springframework.stereotype.Controller; import ...

随机推荐

  1. iOS转场动画初探

    一般我们就用两种转场push和present present /** 1.设置代理 - (instancetype)init { self = [super init]; if (self) { se ...

  2. BZOJ 1087 [SCOI2005]互不侵犯King ——状压DP

    [题目分析] 沉迷水题,吃枣药丸. [代码] #include <cstdio> #include <cstring> #include <iostream> #i ...

  3. 算法复习——floyd求最小环(poj1734)

    题目: 题目描述 N 个景区,任意两个景区之间有一条或多条双向的路来连接,现在 Mr.Zeng 想找一条旅游路线,这个路线从A点出发并且最后回到 A 点,假设经过的路线为 V1,V2,....VK,V ...

  4. JSONObject与JSONArray的使用(jackson)

    1.创建一个JSONObject对象 package com.resource.controller.web; import java.util.ArrayList; import java.util ...

  5. 【Eclipse】eclipse部署web项目至本地的tomcat但在webapps中找不到

    clipse部署web项目至本地的tomcat但在webapps中找不到 1.发现问题 在我的 eclipse 中有个Dynamic Web Project(动态web项目),在本地的 tomcat ...

  6. MysqL5.7在使用mysqldump命令备份数据库报错:mysqldump: [Warning] Using a password on the command line interface can be insecure.

    在阿里云服务器增加一个shell脚本定时备份数据库脚本执行任务时,测试性的执行了备份命令,如下 [root@iZ2ze503xw2q1fftv5rhboZ mysql_bak]# /usr/local ...

  7. python操作excel--生成图表

    [问题] 想要折腾Python中的Excel中的图标,Chart,Graph. [解决过程] 1.参考: use python to generate graph in excel 说是可以用pywi ...

  8. android本地存储SharedPreferences

    SharedPreferences是Android中最容易理解的数据存储技术,实际上SharedPreferences处理的就是一个key-value(键值对)SharedPreferences常用来 ...

  9. Debian9初始配置

    1 进入root用户 su root 2 修改镜像源:编辑/etc/apt/sources.list文件 nano /etc/apt/sources.list 修改内容如下: deb http://m ...

  10. jsp 时间格式

    <%@ taglib prefix='fmt' uri="http://java.sun.com/jsp/jstl/fmt" %> <fmt:formatDate ...