簡介
說明
本文介紹如何使用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";
}
}