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

时间:2015-09-14 14:32:01

标签: java spring spring-mvc url configuration

在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,但据我所知,应用程序在启动后收到这些,而我从头开始需要baseUrl。毕竟,Spring API将HttpServletRequest描述为:“定义一个对象以向servlet提供客户端请求信息”,换句话说,是在启动后从客户端发送的请求。

我当然可以通过在代码中编写私有的最终String来添加静态baseUrl:

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

但是如果应用程序的base-url随着时间的推移发生了变化,那么如果基本URL可以由Spring MVC自动设置会更好。假设我有一个使用依赖注入的Cache类:

@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?

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

3 个答案:

答案 0 :(得分:1)

没有单一的&#34;基本网址&#34;为您的应用程序。想一想 - 您可以访问您的生产服务器:

  • 通过不同的域名
  • 通过IP
  • 通过SSH连接并通过&#34; localhost&#34;
  • 进行访问
  • 通过HTTP和HTTPS

如果您不想或不能反映&#34;基本网址&#34;请求,我的建议是有一个&#34;规范的基本网址&#34;根据环境配置,例如。在属性中。但是如果你的情况有意义的话,这取决于你。

答案 1 :(得分:0)

如果您使用的是java配置和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()获取基本网址。

答案 2 :(得分:0)

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

假设您有两个域www.foo.com和www.bar.com指向运行应用程序的主机。在启动时,您没有任何相关的信息,您将不得不进行反向DNS搜索。 当您收到请求时,您可以获得其来源的信息。

您应该根据请求填写链接,以便您可以删除缓存请求范围信息。