天天看點

SpringBoot--使用attribute儲存每次請求的使用者資訊

簡介

說明

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

儲存屬性

可以放到以下任意一個地方:

  1. 過濾器
  2. 攔截器
  3. ControllerAdvice
  4. 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";
    }
}      

測試