Websphere Liberty Profile中的后备URL

问题描述 投票:0回答:1

我是一个团队开发一个带有相关REST API的单页Web应用程序。

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

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

我们在http://host:9082/webapp/api/上有可用的休息端点...这些端点不能返回索引html,它们必须只返回带有相应状态代码的有效休息响应(400,404,200,201等)

Javascript由qazxsw poo提供...还有其他地方我们不想回到index.html

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

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

http://host:9082/webapp/resource/7/show

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

@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以匹配服务器上的可用资源,这当然可能会发生变化。

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

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

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

非常感谢

websphere-liberty open-liberty
1个回答
0
投票

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

<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>

© www.soinside.com 2019 - 2024. All rights reserved.