首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Spring启动期间找到基本URL?

如何在Spring启动期间找到基本URL?
EN

Stack Overflow用户
提问于 2015-09-14 14:32:01
回答 3查看 3.2K关注 0票数 0

潜伏在Stack fellow的程序员们。

今天的问题是:我如何才能从启动时获得Spring框架中的绝对baseUrl?

我正在为一个应用程序使用Spring框架,我就是在这种情况下:假设我需要将Foo类的对象插入到列表中。每个对象都包含一个独特的自链接(我在实际应用程序中使用org.springframework.hateoas.Link,但这不是重点)。

示例代码:

代码语言:javascript
运行
复制
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;
    }
}

如果我在一家工厂里运行它,它可能看起来是这样的:

代码语言:javascript
运行
复制
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框架获得baseUrl。

我正在使用的Spring应用程序仅通过注释进行配置。我发现通过使用HttpServletRequest.getRequestURL().toString(),可以获得一个绝对的url,但据我所知,应用程序在启动后接收这些url,而我从一开始就需要baseUrl。毕竟,Spring将HttpServletRequest描述为:“定义一个对象以向servlet提供客户端请求信息”,换句话说,是启动后从客户端发送的请求。

当然,我可以通过在代码中编写一个私有的最终字符串来添加一个静态baseUrl:

代码语言:javascript
运行
复制
private final String BASE_URL = "http://www.fooExample.com/"

但是,如果随着时间的推移,应用程序的基url会发生变化,最好是使用Spring自动设置基url。假设我有一个Cache类,它使用依赖项注入:

代码语言:javascript
运行
复制
@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中包含所需信息的对象。最有可能的是,它是框架中的一个配置类,但是在互联网上搜索了一段时间之后,我发现的大多数是与HttpServletRequest相关的解决方案。

我真正需要的是什么Spring类/对象和方法?或者从一开始就需要获取base_url的其他建议是什么?

我需要这个绝对的基本url,而不是相对的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-14 21:02:27

您的应用程序没有单一的“基本URL”。想想看--您可以访问生产服务器:

  • 通过不同的域名
  • 通过IP
  • SSH和通过"localhost“访问
  • 通过HTTP和HTTPS

如果您不想或不能反映请求的“基本URL”,我的建议是为每个环境配置一个“规范的基本URL”。在房产里。但这取决于你,如果这在你的情况下是合理的。

票数 1
EN

Stack Overflow用户

发布于 2015-09-14 14:57:17

如果您使用的是java和Servlet 3.0+样式(没有web.xml),您可以有一个WebApplicationInitializer实现,如:

代码语言:javascript
运行
复制
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。

票数 0
EN

Stack Overflow用户

发布于 2015-09-14 16:20:28

如果没有请求,你就不可能知道这一点。您可以使用InetAddress并解析主机信息,但我猜这不是您想要的。

假设您有两个域www.foo.com和www.bar.com,它们指向正在运行应用程序的主机。在启动时,您没有任何关于这方面的信息,您将不得不执行反向DNS搜索。当您收到请求时,您将得到它来自何处的信息。

您应该根据请求填充链接,这样您就可以摆脱缓存请求范围信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32567438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档