我可以通过server.xml中的配置操作tomcats的request.getServerName()或request.getLocalAddr()应答吗

我可以通过server.xml中的配置操作tomcats的request.getServerName()或request.getLocalAddr()应答吗,tomcat,tcp,Tomcat,Tcp,如果是的话:如何 我需要这个,因为服务器在不同子网络的不同IP下是已知的。据我所知,不可能更改web.xml中的简单配置更改返回的值 但是您可以编写一个ServletRequest/HttpServletRequest包装器,该包装器只将所有方法调用委托给原始请求,并执行您想要返回的非标准值。要包装所有发送到应用程序的请求,可以实现一个,它只包装传入的请求,然后沿着过滤器链传递包装器。然后在web.xml中配置过滤器。此过滤器之后的所有内容都将透明地使用包装器,并将获得您提供的自定义值 包装器可

如果是的话:如何


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

据我所知,不可能更改web.xml中的简单配置更改返回的值

但是您可以编写一个ServletRequest/HttpServletRequest包装器,该包装器只将所有方法调用委托给原始请求,并执行您想要返回的非标准值。要包装所有发送到应用程序的请求,可以实现一个,它只包装传入的请求,然后沿着过滤器链传递包装器。然后在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() { }
}

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

是否仅通过不同的IP或通过不同的主机名?