当前位置: 首页 > 面试题库 >

JSF所需的URL重写解决方案

蒋航
2023-03-14
问题内容

假设以下应用程序格局:

+-----------------+
| 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中的上下文前缀。也欢迎任何其他解决方案。

请指出正确的方向。


问题答案:

我正在发布解决方案,这可能会对其他面临相同问题的人有所帮助。我要做的就是实现自己的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>


 类似资料:
  • "The great thing about mod_rewrite is it gives you all the configurability and flexibility of Sendmail. The downside to mod_rewrite is that it gives you all the configurability and flexibility of Send

  • 请参考:http://www.kancloud.cn/manual/thinkphp/1866

  • Apache 提供了基于正则表达式规则动态修改传入的请求的 URL 的方法。这用于以自己喜欢的任意方法映射任意 URL 到你的内部 URL 结构。 它支持无限的规则,以及为每个规则附加条件,从而提供了一个真正灵活且强大的 URL 操作机制。URL 操作可以依赖于各种测试,例如服务器变量,环境变量,HTTP 头,时戳,甚至外部数据库查询等,以便完成 URL 单元匹配。 这个模块在服务器上下文 (),

  • 在我的大数据项目中,我必须开发一个JSOUP脚本来获取巴黎2018年气象数据并存储它们 我尝试了user\u Agent的所有解决方案,但都有相同的错误(URL在浏览器上工作) 错误显示在第8天,这样他可以在8次请求后检测到这是一个机器人。

  • 我正在尝试解决类似于员工名册的问题。我面临的问题是,每次我运行求解器时,它都会生成不同的任务。这使得更难调试为什么选择特定案例而不是另一个案例。为什么会这样? 附注:我的任务有许多硬性限制,可能无法全部满足(大多数情况下,我仍然看到一些负面的硬性评分)。所以我的终止策略是基于< code > unimprovedSecondsSpentLimit 。会不会是这个原因?

  • 当我们基本完成程序的设计,我们就可以编写代码了,它是对我们的解决方案的实施。 版本一 例10.1 备份脚本——版本一 #!/usr/bin/python # Filename: backup_ver1.py importos importtime # 1. The files and directories to be backed up are specified in a list. sour