如果是的话:怎么样?
我需要这个,因为服务器在不同的子网络中的不同IP下是已知的。
答案 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实例服务的每个子域设置虚拟主机。