简介
说明
本文介绍如何使用HttpServletRequest的attribute来保存每次请求的用户信息。
保存之后,后边的业务操作就可以获取(Controller或者Service都可以,只要在一个请求中)。
相关网址
也可以使用ThreadLocal保存每次请求的用户信息,见 :SpringBoot--使用ThreadLocal保存每次请求的用户信息_IT利刃出鞘的博客
代码
用户实体类
package com.knife.common.entity;
import lombok.Data;
@Data
public class UserDTO {
private Long userId;
private String userName;
}
保存属性
可以放到以下任意一个地方:
- 过滤器
- 拦截器
- ControllerAdvice
- AOP
本处我使用ControllerAdvice。
package com.knife.common.advice;
import com.knife.common.entity.UserDTO;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
public class GlobalRequestAdvice {
@ModelAttribute
public void authenticationUser(HttpServletRequest request) {
// 此处实际应该根据header的token解析出用户
// 本处为了简单,直接虚构一个用户
UserDTO userDTO = new UserDTO();
userDTO.setUserId(3L);
userDTO.setUserName("Tony");
request.setAttribute("user", userDTO);
}
}
获取属性
package com.knife.controller;
import com.knife.common.entity.UserDTO;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
@RestController
public class HelloController {
@GetMapping("/test")
public String test() {
ServletRequestAttributes servletRequestAttributes =
(ServletRequestAttributes) RequestContextHolder.currentRequestAttributes();
HttpServletRequest request = servletRequestAttributes.getRequest();
UserDTO userDTO = (UserDTO)request.getAttribute("user");
System.out.println(userDTO.toString());
return "test success";
}
}