【问题标题】:Fallback URLs in Websphere Liberty ProfileWebsphere Liberty Profile 中的后备 URL
【发布时间】:2018-02-19 12:52:14
【问题描述】:

我所在的团队正在开发具有关联 REST API 的单页 Web 应用程序。

我想知道是否有人可以帮助我?我正在尝试为我们的应用程序找到一种方法,以便在访问某些 URL 时返回 index.html 的内容并返回 200 响应。例如,客户端希望在 URL 中嵌入信息,但希望返回 index.html 上的内容。

例如,我们的单页 Web 应用程序可在单个上下文根中使用,例如:http://host:9082/webapp

我们在 http://host:9082/webapp/api/ 上有可用的 rest 端点...这些端点不得返回 index html,它们只能返回具有适当状态代码(400、404、200、201 等)的有效 rest 响应

Java 脚本从 http://host:9082/webapp/js/... 提供,还有其他位置我们不想退回到 index.html

但是,如果客户端请求 http://host:9082/webapp/resource/7/show,我们希望 index.html 返回状态码 200。然后客户端将从 URL 中提取含义以驱动其他 REST 请求。

所以我尝试编写如下过滤器:

@Override
public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException
{
    final HttpServletRequest request = (HttpServletRequest)servletRequest;
    final HttpServletResponse response = (HttpServletResponse)servletResponse;
    final String requestUri = request.getRequestURI();
    if (!excluded(requestUri))
    {
        request.getRequestDispatcher(INDEX_HTML).forward(request, response);
    }
    else
    {
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

private boolean excluded(String requestUri)
{
    for (String part : mExcludedUriParts)
    {
        if (requestUri.contains(part))
        {
            return true;
        }
    }
    return false;
}

并在 web.xml 中启用过滤器,如下所示:

<filter>
    <filter-name>FallbackFilter</filter-name>
    <filter-class>com....http.filter.internal.FallbackFilter</filter-class>
    <init-param>
        <param-name>excludedUriParts</param-name>
        <param-value>/api/,.js/,.png,.html,/apidocs/,/users/imgs/</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>FallbackFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

但是这种方法非常脆弱,因为部署需要更改 web.xml 以匹配服务器上的可用资源,这当然可能会发生变化。

我们还考虑在 filterChain 中检测 404,然后修改响应,但 Liberty 不允许这样做,因为响应已经提交。我们也考虑过使用请求接受头(即 text/html)作为是否返回 index html 的依据,但是我们还有其他 html 文件,所以这种方法也不起作用。

我们基本上想要一种方法来允许服务器上一些不存在的位置返回带有 200 状态代码的 index.html。理想情况下,我们希望收到 404 通知并控制响应。

有没有办法使用过滤器或 Liberty 中的任何其他机制来实现这一点?

非常感谢

【问题讨论】:

  • 您是否考虑过使用 URL 片段进行导航?

标签: websphere-liberty open-liberty


【解决方案1】:

我不确定这一点,但是如果您将响应包装在 ServletResponseWrapper 中,您可能能够拦截 PrintWriter.flush() ,因此设置 404 不会提交响应,然后过滤器可以使用它。这里有一个用于其他用途的示例:

https://www.ibm.com/support/knowledgecenter/SSAW57_8.5.5/com.ibm.websphere.nd.iseries.doc/ae/twbs_jaxrs_handlers_servlet_filters.html

【讨论】:

  • 嗨!感谢您的输入。我看过这个方法,但我需要在 REST 之外应用过滤器,因此在 JaxRS 之外。过滤器映射也给我带来了问题,因为我想让其他过滤器在 REST 资源(“/api/*”)上运行,但我希望这个过滤器在其他任何东西上运行,(实际上 URI 不匹配“/api/* )。
猜你喜欢
  • 1970-01-01
  • 2013-08-07
  • 2013-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多