前言

项目中遇到这么一个使用场景,用户的登录信息给予token保存,在需要有登录信息的地方,每次都要去获取用户Id,但每次在请求方法中去获取用户信息,代码重复,冗余,很low于是想到了用@ModelAttribute 这个属性

使用场景

不用@ModelAttribute 时候在需要用户信息的请求中每次需要单独获取用户信息

  String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token);

代码重复每次都需要单独去写,

于是我想到了去优化一下代码,在需要使用户信息的controller中写一个公共方法,每次直接获取就可以了

private User gerUserInfo(HttpServletRequest request){
String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token);
return LoginUser;
}

这样写代码是简化了一些,但是没什么特别大的改观,还是要在每个需求用户信息的请求Controller中调用此方法取获取用用户信息,如果多个Controller需要获取用户信息的话还需要重复写

也是想到继承,写一个公共的controllerBaseController,每次在需要用户信息的controller中继承BaseController 然后在调用就可以了

@RestController
public class BaseController {
@Autowired
private TokenService tokenService; private User gerUserInfo(HttpServletRequest request){
String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token);
return LoginUser;
}
}

这样看上去似乎比之前两种做法都简单便捷很多,在需要使用用户信息的controller中直接继承调用就可以啦,但是并没有根本解决我们的问题,我们还是需要写重复代码,在每个controller单独获取用户信息,这是最优嘛?并不是!!!

其实呢springboot提供@ModelAttribute这个注解属性使用这个通过参数注入就可获取啦

我们把上面的稍微调整一下如:

@RestController
public class BaseController {
@Autowired
private TokenService tokenService; @ModelAttribute
public void userInfo(ModelMap modelMap, HttpServletRequest request) {
String token = request.getAttribute("token").toString();
User LoginUser = tokenService.decodeToken(token); modelMap.addAttribute("LoginUser", LoginUser);
modelMap.addAttribute("userId", LoginUser.getUserId()); }
}

然后在需要使用用户信息的controller中进行参数映射就行啦

@ApiOperation(value = "用户快过期优惠卷信息",tags = "优惠卷接口")
@GetMapping("/expiredCoupon")
public List<Coupon> userExpiredCoupon(@ModelAttribute("userId") @ApiParam(hidden = true) String userId){
return couponService.getUserExpiredCoupon(userId);
}
@GetMapping("/info")
@ApiOperation("获取用户信息")
public User getUseInfo(@ModelAttribute("LoginUser") User user) {
return user;
}

这样用户信息通过形参直接注入到controller中,我们直接在请求中使用就可以啦

@ModelAttribute详解

  1. @ModelAttribute注释的方法会在此controller每个方法执行前被执行

    标注在方法上面的注解,将方法返回的对象存储在model中,该方法在这个控制器其他映射方法执行之前调用
  2. @ModelAttribute注释一个方法的参数 从model中获取参数@ModelAttribute("LoginUser") User user参数user的值来源于BaseControlleruserInfo()方法中的model属性

具体更详细使用参考 @ModelAttribute注解的使用总结

SpringBoot @ModelAttribute 用法的更多相关文章

  1. SpringBoot进阶用法-随笔

    SpringBoot进阶用法 实现setApplicationContext //实现ApplicationContextAware接口,重写setApplicationContext方法 publi ...

  2. ModelAttribute用法之一

    @ModelAttribute也可以做为Model输出到View时使用,比如: 测试例子   package com.my.controller; import java.util.ArrayList ...

  3. SpringBoot HATEOAS用法简介

    REST风格简介 介绍HATEOAS之前先简单介绍一下REST,REST 是 Representational state transfer 的缩写,翻译过来的意思是表达性状态转换.REST是一种架构 ...

  4. springboot中filter的用法

    一.在spring的应用中我们存在两种过滤的用法,一种是拦截器.另外一种当然是过滤器.我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别. 二 ...

  5. 基于SpringBoot搭建应用开发框架(二) —— 登录认证

    零.前言 本文基于<基于SpringBoot搭建应用开发框架(一)——基础架构>,通过该文,熟悉了SpringBoot的用法,完成了应用框架底层的搭建. 在开始本文之前,底层这块已经有了很 ...

  6. SpringBoot系列: Spring MVC视图方法的补充

    SpringMVC 视图方法的参数, 已经在这个文章中写得非常清楚了, 链接为 https://www.cnblogs.com/morethink/p/8028664.html 这篇文章做一些补充. ...

  7. Spring @ModelAttribute

    正文开始之前,先介绍个东西,Spring能够自动将请求参数封装到对应JavaBean上! 代码比较简单,也没有什么配置要记录,只是开启了<mvc:annotation-driven/>,可 ...

  8. SpringBoot入门 简单搭建和使用

    前言 差不多两年前,那个时候我准备要做毕业设计了,才第一次知道java有框架这种东西,在网上找了好多SSM的教程,那会儿真的是Spring+SpringMVC+MyBatis搭建的,印象极深的是还要写 ...

  9. Spring MVC中Controller如何将数据返回给页面

    要实现Controller返回数据给页面,Spring MVC 提供了以下几种途径: ModelAndView:将视图和数据封装成ModelAndView对象,作为方法的返回值,数据最终会存到Http ...

随机推荐

  1. token & refresh token 机制总结

    token & refresh token 机制总结 废话 我在项目上写了个配置页面,之前很简单直接登录,毕竟配置页面自己人用就没有做token机制,后来公司的安全审核不过,现在要加上toke ...

  2. Terraform入门教程,示例展示管理Docker和Kubernetes资源

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 1 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: T ...

  3. Flannel和Calico网络插件对比

    1.Kubernetes通信问题 1.容器间通信:即同一个Pod内多个容器间通信,通常使用loopback来实现. 2.Pod间通信:K8s要求,Pod和Pod之间通信必须使用Pod-IP 直接访问另 ...

  4. js jquey 笔记

    1.使用insertAfter 如果插入在tr后添加多行数据,数据会倒过来注意组字符串需要倒着循环 1).html方法,给元素添加html代码或者清空html代码(参数为空字符串): 2).appen ...

  5. 不止Docker:8款容器管理开源方案

    Docker诞生于2013年,并普及了容器的概念,以至于大多数人仍然将容器的概念等同于"Docker容器". 作为第一个吃螃蟹的人,Docker设置了新加入者必须遵守的标准.例如, ...

  6. 通过RenderDoc真机抓取数据来落地验证和解决特效性能的问题

    前言 需求是来自于我在为我司的一个线上RPG游戏做特效的性能优化的过程中,需要验证对特效的一个改动是否能够提高性能,当然这个改动是在不影响美术效果的前提. 特效性能问题 技能特效 主角的一个大招(技能 ...

  7. SpringMVC的注解关键词解释

    SpringMVC的注解关键词解释 @Controller控制器定义 和Struts1一样,Spring的Controller是Singleton的.这就意味着会被多个请求线程共享.因此,我们将控制器 ...

  8. vim编辑器使用方法(相关指令)

    1.跳到文本的最后一行:按"G",即"shift+g" 2.跳到最后一行的最后一个字符 : 先重复1的操作即按"G",之后按"$& ...

  9. 13 shell while循环与until循环

    while 循环是 Shell 脚本中最简单的一种循环,当条件满足时,while 重复地执行一组语句,当条件不满足时,就退出 while 循环. unti 循环和 while 循环恰好相反,当判断条件 ...

  10. PHP单例模式 (转)

      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 27 28 29 30 31 32 33 34 35 36 ...