最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot從Service層獲取request.getHeader()的幾種方式

 更新時(shí)間:2026年01月08日 10:16:59   作者:悟能不能悟  
在SpringBoot中,可以通過(guò)多種方式從Service層獲取request.getHeader(),包括通過(guò)方法參數(shù)傳遞、使用RequestContextHolder、ThreadLocal、攔截器、注入HttpServletRequest等,推薦使用方法參數(shù)傳遞,適用于大多數(shù)場(chǎng)景,根據(jù)具體需求,可以選擇適合的方案

在Spring Boot中,有幾種方式可以從Service層獲取request.getHeader()

1.通過(guò)方法參數(shù)傳遞(推薦)

Service接口:

@Service
public class UserService {
    public String getUserInfo(String headerValue) {
        // 使用headerValue
        return "處理Header: " + headerValue;
    }
}

Controller層:

@RestController
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/user")
    public String getUser(@RequestHeader("Authorization") String token) {
        return userService.getUserInfo(token);
    }
}

2.使用RequestContextHolder(常用)

@Service
public class UserService {
    
    public String getUserInfo() {
        // 獲取HttpServletRequest對(duì)象
        HttpServletRequest request = ((ServletRequestAttributes) 
            RequestContextHolder.getRequestAttributes()).getRequest();
        
        // 獲取特定Header
        String token = request.getHeader("Authorization");
        String userAgent = request.getHeader("User-Agent");
        
        // 獲取所有Header名稱
        Enumeration<String> headerNames = request.getHeaderNames();
        
        return "Token: " + token;
    }
}

3.通過(guò)ThreadLocal持有Request

創(chuàng)建RequestHolder工具類:

@Component
public class RequestHolder {
    
    private static final ThreadLocal<HttpServletRequest> requestHolder = new ThreadLocal<>();
    
    public static void setRequest(HttpServletRequest request) {
        requestHolder.set(request);
    }
    
    public static HttpServletRequest getRequest() {
        return requestHolder.get();
    }
    
    public static String getHeader(String headerName) {
        HttpServletRequest request = getRequest();
        return request != null ? request.getHeader(headerName) : null;
    }
    
    public static void remove() {
        requestHolder.remove();
    }
}

創(chuàng)建攔截器:

@Component
public class RequestInterceptor implements HandlerInterceptor {
    
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) {
        RequestHolder.setRequest(request);
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, 
                              HttpServletResponse response, 
                              Object handler, 
                              Exception ex) {
        RequestHolder.remove(); // 防止內(nèi)存泄漏
    }
}

注冊(cè)攔截器:

@Configuration
public class WebConfig implements WebMvcConfigurer {
    
    @Autowired
    private RequestInterceptor requestInterceptor;
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestInterceptor);
    }
}

Service中使用:

@Service
public class UserService {
    
    public String getUserInfo() {
        String token = RequestHolder.getHeader("Authorization");
        return "Token: " + token;
    }
}

4.注入HttpServletRequest

@Service
public class UserService {
    
    @Autowired
    private HttpServletRequest request;  // 需要@RequestScope
    
    public String getUserInfo() {
        String token = request.getHeader("Authorization");
        return "Token: " + token;
    }
}

注意:這種方式需要在Spring Boot 2.x及以上版本,并且Service必須是RequestScope。

@Service
@RequestScope
public class UserService {
    // ...
}

5.封裝Header信息到DTO

HeaderDTO:

@Data
public class RequestContext {
    private String token;
    private String userAgent;
    private String clientIp;
    // 其他需要的Header信息
}

Controller:

@RestController
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/user")
    public String getUser(HttpServletRequest request) {
        RequestContext context = new RequestContext();
        context.setToken(request.getHeader("Authorization"));
        context.setUserAgent(request.getHeader("User-Agent"));
        
        return userService.getUserInfo(context);
    }
}

6.使用AOP獲取

@Aspect
@Component
public class RequestAspect {
    
    @Pointcut("execution(* com.example.service..*.*(..))")
    public void servicePointcut() {}
    
    @Before("servicePointcut()")
    public void before(JoinPoint joinPoint) {
        HttpServletRequest request = ((ServletRequestAttributes) 
            RequestContextHolder.getRequestAttributes()).getRequest();
        
        // 可以將Header信息放入MDC或ThreadLocal
        MDC.put("token", request.getHeader("Authorization"));
    }
}

最佳實(shí)踐建議:

  1. 推薦方案1:通過(guò)方法參數(shù)傳遞,保持Service層純凈
  2. 異步場(chǎng)景:如果需要跨線程,需要手動(dòng)傳遞Header信息
  3. 日志追蹤:可以使用MDC存儲(chǔ)TraceID等跟蹤信息
  4. 安全性:注意ThreadLocal的清理,避免內(nèi)存泄漏
// 異步線程中傳遞Header的示例
@Async
public CompletableFuture<String> asyncProcess() {
    // 在主線程獲取Header
    String token = ((ServletRequestAttributes) 
        RequestContextHolder.getRequestAttributes())
        .getRequest()
        .getHeader("Authorization");
    
    return CompletableFuture.supplyAsync(() -> {
        // 異步線程中無(wú)法直接獲取RequestContextHolder
        // 需要手動(dòng)傳遞
        return processWithToken(token);
    });
}

選擇哪種方式取決于具體業(yè)務(wù)場(chǎng)景,一般來(lái)說(shuō),優(yōu)先考慮方案1或方案2。

以上就是SpringBoot從Service層獲取request.getHeader()的幾種方式的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Service獲取request.getHeader()的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Springboot @WebFilter無(wú)法注入其他Bean的示例問(wèn)題

    Springboot @WebFilter無(wú)法注入其他Bean的示例問(wèn)題

    這篇文章主要介紹了Springboot @WebFilter無(wú)法注入其他Bean的示例問(wèn)題,本文通過(guò)示例代碼給大家分享解決方法,需要的朋友可以參考下
    2021-09-09
  • Java實(shí)現(xiàn)按比例縮小圖片

    Java實(shí)現(xiàn)按比例縮小圖片

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)按比例縮小圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • 配置springboot項(xiàng)目使用外部tomcat過(guò)程解析

    配置springboot項(xiàng)目使用外部tomcat過(guò)程解析

    這篇文章主要介紹了配置springboot項(xiàng)目使用外部tomcat過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • 詳解Java中的ReentrantLock鎖

    詳解Java中的ReentrantLock鎖

    這篇文章主要介紹了Java中ReentrantLock鎖的相關(guān)資料,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2021-01-01
  • java中使用dom4j解析XML文件的方法教程

    java中使用dom4j解析XML文件的方法教程

    在最近的開(kāi)發(fā)中用到了dom4j來(lái)解析xml文件,所以便有了這篇文章,本文主要給大家介紹了關(guān)于java中使用dom4j解析XML文件的方法教程,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-09-09
  • Netty粘包問(wèn)題的常見(jiàn)解決方案

    Netty粘包問(wèn)題的常見(jiàn)解決方案

    粘包和拆包問(wèn)題也叫做粘包和半包問(wèn)題,它是指在數(shù)據(jù)傳輸時(shí),接收方未能正常讀取到一條完整數(shù)據(jù)的情況(只讀取了部分?jǐn)?shù)據(jù),或多讀取到了另一條數(shù)據(jù)的情況)就叫做粘包或拆包問(wèn)題,本文介紹了Netty如何解決粘包問(wèn)題,需要的朋友可以參考下
    2024-06-06
  • SpringBoot中spring.factories文件的作用及讀取過(guò)程

    SpringBoot中spring.factories文件的作用及讀取過(guò)程

    SpringBoot通過(guò)spring.factories文件實(shí)現(xiàn)自動(dòng)配置和擴(kuò)展機(jī)制,該文件位于類路徑下的META-INF目錄中,鍵是接口或抽象類的全限定名,值是實(shí)現(xiàn)類的全限定名列表,SpringFactoriesLoader類負(fù)責(zé)讀取和解析spring.factories文件,獲取指定工廠類型的實(shí)現(xiàn)類列表
    2025-11-11
  • SpringBoot生成條形碼的方案詳解

    SpringBoot生成條形碼的方案詳解

    在Spring Boot, Spring Cloud 項(xiàng)目中整合ZXing庫(kù)來(lái)生成條形碼在特定行業(yè)也是一個(gè)常見(jiàn)需求,ZXing是google開(kāi)源的一個(gè)功能強(qiáng)大的Java庫(kù),專門用于二維碼/條形碼等的生成與解析,所以本文給大家介紹了SpringBoot生成條形碼的方案,需要的朋友可以參考下
    2024-08-08
  • 解決SpringCloud Config結(jié)合github無(wú)法讀取配置的問(wèn)題

    解決SpringCloud Config結(jié)合github無(wú)法讀取配置的問(wèn)題

    這篇文章主要介紹了解決SpringCloud Config結(jié)合github無(wú)法讀取配置的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Spring中的@Pointcut切點(diǎn)詳解

    Spring中的@Pointcut切點(diǎn)詳解

    這篇文章主要介紹了Spring中的@Pointcut切點(diǎn)詳解,pointcut就是切點(diǎn),通知需要在哪些方法處進(jìn)行增強(qiáng),在AspectJ中用@Pointcut注解表達(dá)式標(biāo)注,需要的朋友可以參考下
    2023-08-08

最新評(píng)論

筠连县| 南开区| 黔西县| 康定县| 武城县| 全椒县| 利川市| 正镶白旗| 会宁县| 德昌县| 合作市| 南靖县| 盱眙县| 屏东市| 铜陵市| 嘉善县| 琼结县| 江津市| 汝阳县| 鲁山县| 修文县| 奉新县| 沂源县| 江城| 乌拉特前旗| 方山县| 嘉峪关市| 苍溪县| 清镇市| 抚宁县| 辰溪县| 偏关县| 蓝山县| 奈曼旗| 宜黄县| 安龙县| 英超| 砀山县| 施甸县| 开化县| 五莲县|