当前位置: 首页 > 知识库问答 >
问题:

WebSphere Liberty Profile中的回退URL

白芷阳
2023-03-14

我在一个团队中开发一个带有相关RESTAPI的单页web应用程序。

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

例如,我们的单页Web应用程序可在单个上下文根上使用,例如:超文本传输协议://host: 9082/webapp

我们在http://host:9082/webapp/api/上提供了restendpoint...这些endpoint不能返回索引html,它们必须只返回带有适当状态代码(400、404、200、201等)的有效rest响应

Java脚本由超文本传输协议提供://host: 9082/webapp/js/…

但是,如果客户端请求http://host:9082/web app/resource/7/show,我们希望返回状态代码为200的index.html。然后,客户机将从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来匹配服务器上的可用资源,这当然会改变。

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

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

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

非常感谢

共有1个答案

董翰墨
2023-03-14

我不确定这一点,但是如果您将响应包装在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

 类似资料:
  • 问题内容: 我将使用解决方案来更新此问题,我想包括我的问题和解决方案,因为我无法在Stackoverflow上找到它。如果您想加入解决方案,请放心。 我有一个使用Visual Studio 2013创建的新创建的“空” MVC5项目。如果可能,我需要from并想要AJAX行为。在MVC3中使用Ajax.BeginForm总是很简单,所以我认为在MVC5中也是如此。 但是,当我单击“提交”按钮时,在

  • 我想运行"sudo whoami"命令在PHP脚本。 我已经添加了下一行到 /etc/sudoers Apache ALL=(ALL)NOPASSWD:/usr/bin/whoami 然后执行脚本 $result为空$return_var==1 终端命令 返回“root”。 PHP 5.6.38 CentOS 7.5。1804

  • 我目前正在对一个相对较大的项目的log4j配置进行微调。目前,我还没有为所有可能创建日志项的位置配置日志级别。 我想让log4j拥有某种回退appender来记录没有为其配置其他appender的所有消息。例如,如果我有一条日志消息: 登录: a. b. c. d: WARN 并且有一个附加程序,配置为用级别INFO记录包a. b. c,然后输出记录到该附加程序。 但是,如果我没有配置append

  • Git版本回退的意思就是将本地代码回退到某一个指定的版本,此版本之前的所有内容都会被重置. 操作方法: VCS —> Git —> Reset HEAD—> 弹出Reset Head对话框. Reset HEAD: Reset Type: 回退类型 Mixed:回退到某个版本,本地源码不会回退, 会回退commit和index信息. Soft:回退到某个版本, 本地源码和index信息不会回退,

  • 每一个合约有且仅有一个没有名字的函数。这个函数无参数,也无返回值。如果调用合约时,没有匹配上任何一个函数(或者没有传哪怕一点数据),就会调用默认的回退函数。 此外,当合约收到ether时(没有任何其它数据),这个函数也会被执行。在此时,一般仅有少量的gas剩余,用于执行这个函数(准确的说,还剩2300gas)。所以应该尽量保证回退函数使用少的gas。 下述提供给回退函数可执行的操作会比常规的花费得