簡體   English   中英

在Spring MVC啟動期間如何找到基本URL?

[英]How do I find base URL during Spring MVC startup?

潛伏在Stack Overflow的其他程序員。

今天的問題:如何從啟動中獲取Spring MVC Framework中的絕對baseUrl?

我正在為應用程序使用Spring MVC Framework,並且處於這種情況:假設我需要將Foo類的對象插入到列表中。 每個對象都包含一個唯一的自我鏈接(我在實際應用程序中使用的是org.springframework.hateoas.Link,但這並不重要)。

示例代碼:

class Foo{
    private int ID;
    private String absoluteUrl;

    public Foo(int ID, String baseUrl){
        this.ID = ID;
        this.absoluteUrl = baseUrl + ID; 
    }

    public void setAbsoluteUrl(String baseUrl){
        this.absoluteUrl = baseUrl + this.ID;
    }
}

如果我在工廠中運行它,則可能看起來像這樣:

public List<Foo> GenerateFooList(String baseUrlFetchedBySpring){
    List<Foo> list = new ArrayList();
    for (int i = 0; i<100; i++){
    list.add(new Foo(i, baseUrlFetchedBySpring);
    return list;
}

我期望在測試階段得到的基本地址為“ http:// localhost:8000 ”(或者假設在生產中為“ http://www.fooExample.com ”)。

我的問題:我需要在啟動時從Spring MVC Framework獲取baseUrl。

我正在使用的Spring MVC應用程序僅由注釋配置。 我發現可以使用HttpServletRequest.getRequestURL()。toString()來獲取絕對URL,但是據我了解,應用程序啟動會收到這些URL,而我從一開始就需要baseUrl。 畢竟,Spring API將HttpServletRequest描述為:“定義一個對象以向Servlet提供客戶端請求信息”,換句話說,是啟動從客戶端發送的請求。

我當然可以通過在代碼中編寫私有的最終String來添加靜態baseUrl:

private final String BASE_URL = "http://www.fooExample.com/"

但是,如果應用程序的基本URL隨時間變化,最好由Spring MVC自動設置基本URL。 假設我有一個Cache-class,它使用依賴項注入:

@Repository
class FooCache{

    List<Foo> list;
    SpringObject springObject; // = ???????????

    @Autowired
    public FooCache(SpringObject springObject){
        this.springObject = springObject; // = ???????????
        initCache();
    }

    public void initCache(){
        for (int i = 0; i<100; i++){
        list.add(new Foo(i, springObject.getAbsoluteBaseUrl()); // method = ???????????
    }
}

這更多的是我要尋找的內容:緩存一開始只使用來自Spring的包含我所需信息的對象設置了一次。 最有可能的是,它是框架的一部分,是配置類,但是在Internet上搜索了一段時間之后,我最發現的是與HttpServletRequest相關的解決方案。

我真正在尋找什么Spring類/對象和方法? 或者您還需要從頭開始獲取base_url的其他建議嗎?

我需要這個的絕對基本URL,而不是相對的URL。

您的應用程序沒有單個“基本URL”。 考慮一下-您可以訪問生產服務器:

  • 通過不同的域名
  • 通過IP
  • SSH到它並通過“ localhost”訪問
  • 通過HTTP和HTTPS

如果您不想或無法反映請求的“基本URL”,我的建議是為每個環境配置一個“規范基本URL”,例如。 在屬性中。 但這取決於您的情況。

如果您使用的是Java config和Servlet 3.0+風格(沒有web.xml),則可以使用WebApplicationInitializer實現,例如:

public class MyWebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext container) {
        ServletRegistration.Dynamic registration = container.addServlet("dispatcher", new DispatcherServlet());
        registration.setLoadOnStartup(1);
        registration.addMapping("/example/*");
    }

}

通過這種安排,您可以使用servletContext.getContextPath()來獲取基本URL。

沒有請求,您將無從得知。 您可以使用InetAddress並解析主機信息,但是我想這不是您想要的。

假設您有兩個域www.foo.com和www.bar.com指向運行應用程序的主機。 啟動時,您沒有任何信息,則必須進行反向DNS搜索。 收到請求后,您將獲得來自何處的信息。

您應該根據請求填寫鏈接,以便擺脫緩存請求范圍信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM