4

我有一个需要知道当前HttpServletRequest. getServerName()jspx 可以#{mybean.serverName}从它的 bean 中获取它,如下所示:

public String getServerName() {
  HttpServletRequest request = (HttpServletRequest) FacesInstance.getCurrentInstance().getExternalContent().getRequest();
  return request.getServerName();
}

但是,当它在代理(带有 mod_proxy 的 Apache)后面提供时,有时getServerName()会返回节点的主机名而不是前端的主机名。其他时候它可以正常工作。

然而,一个普通的 jsp<% request.getServerName(); %>总是会返回前端的主机名。

FacesInstance 有什么问题HttpServletRequest?有没有办法获取“真实”的请求对象?

4

1 回答 1

4

FacesContext 的 HttpServletRequest 有什么问题?

您正在获得底层实现请求(恰好是 servlet API)。这与 JSF 几乎没有关系,因为您要让 API 将容器提供的对象调用到 JSF 的 servlet。

JSPrequest对象也是一个javax.servlet.ServletRequest; 它们很可能是同一个对象。

请求有可能被包装(例如通过 a HttpServletRequestWrapper),但是很难看出通过改变从 的返回值会得到什么getServerName()

我怀疑解析主机名的方式有一些副作用。我会研究如何getServerName()在您的服务器中实现工作。

仅供参考:您应该能够在没有托管 bean 的情况下引用该值。EL 表达式${pageContext.request.serverName}(未经测试)应该返回值(pageContext是 JSP 中的隐式变量)。

于 2009-11-25T12:21:07.110 回答