微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

JSF所需的URL重写解决方案

如何解决JSF所需的URL重写解决方案

我正在发布解决方案,这可能会对其他面临相同问题的人有所帮助。我要做的就是实现自己的javax.faces.application.ViewHandler并将其注册faces- config.xml

public class CustomViewHandler extends ViewHandlerWrapper {
  private ViewHandler wrappped;

  public CustomViewHandler(ViewHandler wrappped) {
    super();
    this.wrappped = wrappped;
  }

  @Override
  public ViewHandler getWrapped() {
    return wrappped;
  }

  @Override
  public String getActionURL(FacesContext context, String viewId) {
    String url =  super.getActionURL(context, viewId);
    return removecontextpath(context, url);
  }

  @Override
  public String getRedirectURL(FacesContext context, String viewId, Map<String, List<String>> parameters, boolean includeViewParams) {
    String url =  super.getRedirectURL(context, viewId, parameters, includeViewParams);
    return removecontextpath(context, url);
  }

  @Override
  public String getResourceURL(FacesContext context, String path) {
    String url = super.getResourceURL(context, path);
    return removecontextpath(context, url);
  }

  private String removecontextpath(FacesContext context, String url) {
    ServletContext servletContext = (ServletContext) context.getExternalContext().getContext();
    String contextpath = servletContext.getcontextpath();
    if("".equals(contextpath)) return url; // root context path, nothing to remove
    return url.startsWith(contextpath) ? url.substring(contextpath.length()) : url;
  }
}

faces-config.xml:

<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
              version="2.0">
  <application>
    <view-handler>test.CustomViewHandler</view-handler>
  </application>
</faces-config>

解决方法

假设以下应用程序格局:

+-----------------+
| App server      |
+-----------------+
|                 |                                   +-------+
| ear1            |                                   |       |
|  +-web1 (/ctx1) +--<-- http://localhost/ctx1/xxx/ --+       +--<-- http://www.example.com/xxx/
|                 |                                   |       |
|                 |                                   | proxy |
| ear2            |                                   |       |
|  +-web2 (/ctx2) +--<-- http://localhost/ctx2/yyy/ --+       +--<-- http://abc.example.com/yyy/
|                 |                                   |       |
+-----------------+                                   +-------+

如您所见,代理(nginx在我的情况下)是将请求转发到单个应用程序服务器实例,该实例又具有多个具有不同上下文路径的Web模块。当然,我不希望我的公共服务器公开内部上下文根,并且代理服务器可以很好地完成工作,包装和拆开http请求等。但是仍然存在一个大问题:JSF生成的html代码(链接,css,js资源,表单动作)包含上下文路径,/ctx1/ctx2在我的情况。那就是我要避免的。

除了使用越来越多的应用服务器实例(域),导致我的硬件资源逐渐消失之外,我目前没有任何解决方案。据我了解,我需要用一些包装器扩展我的JSF应用程序,这些包装器可能已在中注册faces- config.xml,这将删除生成的html中的上下文前缀。也欢迎任何其他解决方案。

请指出正确的方向。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。