代码之家  ›  专栏  ›  技术社区  ›  Kai Huppmann

我可以通过server.xml中的配置操作tomcats-answer-on-request.getservername()或request.getlocaladdr()吗?

  •  0
  • Kai Huppmann  · 技术社区  · 16 年前

    如果是这样的话:如何?

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

    2 回复  |  直到 16 年前
        1
  •  2
  •   Simon Lehmann    16 年前

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

    但是,您可以编写一个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() { }
    }
    
        2
  •  0
  •   Gandalf    16 年前

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

    推荐文章