我是否可以通过server.xml中的配置操作tomcats对request.getServerName()或request.getLocalAddr()的回答

时间:2009-06-17 12:11:26

标签: tomcat tcp

如果是的话:怎么样?

我需要这个,因为服务器在不同的子网络中的不同IP下是已知的。

2 个答案:

答案 0 :(得分:2)

据我所知,只需在web.xml中进行简单的配置更改,就无法更改ServletRequest.getServerName()ServletRequest.getLocalAddr()返回的值。

但是你可以写一个ServletRequest / HttpServletRequest包装器,它只是将所有方法调用委托给原始请求,除了那些你想要返回非标准值的方法。要包装发送到您的应用程序的所有请求,您可以实现Filter,它只包装传入的请求,然后沿着过滤器链传递包装器。然后,将在web.xml中配置过滤器。此过滤器之后的所有内容都将透明地使用您的包装器,并将获得您提供的自定义值。

包装器可能如下所示:

public class WrappedRequest implements ServletRequest {

    private final ServletRequest original;

    private String customServerName;

    public WrappedRequest(ServletRequest original) {
        this.original = original;
    }

    // ... delegate all method calls to original

    public String getServerName() {
        if (this.customServerName != null) {
            return this.customServerName;
        }
        return this.original.getServerName();
    }

    public void setServerName(String customServerName) {
        this.customServerName = customServerName;
    }
}

过滤器:

public class RequestWrapperFilter implements Filter {

    private final String serverName;

    public void init(FilterConfig filterConfig) {
        this.serverName = filterConfig.getInitParameter("serverName");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        WrappedRequest wrapped = new WrappedRequest(request);
        wrapper.setServerName(this.serverName);

        chain.doFilter(wrapped, response);
    }

    public void destroy() { }
}

答案 1 :(得分:0)

您可以尝试为您使用此Tomcat实例服务的每个子域设置虚拟主机。