【问题标题】:Redirect All URL to return index.html in App Engine Java servlet在 App Engine Java servlet 中重定向所有 URL 以返回 index.html
【发布时间】:2012-10-09 03:36:07
【问题描述】:

Web 应用程序在 Google App Engine 上运行的后端使用 Java Restlet。

我想为所有 url (/*) 返回 index.html。

在这里,我不想使用response.redirect,我的意思是,客户端不应该知道重定向。

我在 web.xml 中使用了以下代码。

  <servlet>
    <servlet-name>RestletServlet</servlet-name>
    <servlet-class>org.restlet.ext.servlet.ServerServlet</servlet-class>
    <init-param>
        <param-name>org.restlet.application</param-name>
        <param-value>com.post.PostApplication</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>RestletServlet</servlet-name>
    <url-pattern>/api/v1/*</url-pattern>
</servlet-mapping>

 <servlet>
    <servlet-name>StartPageServlet1</servlet-name>
    <jsp-file>/client/index.html</jsp-file>  
</servlet>
<servlet-mapping>
    <servlet-name>StartPageServlet1</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

它使用 Restlet 服务于所有 /api/v1 请求。它工作正常。 但是 /* 应该总是返回 index.html。我该怎么做?

【问题讨论】:

  • 你配置你的yaml文件了吗?
  • 不,我使用 Java。我有 web.xml 文件。
  • 你试过修改你的web.xml吗?你能提供它的内容吗?

标签: java google-app-engine servlets restlet-2.0


【解决方案1】:

您可以插入 filter 并检查请求 URI,并根据它决定是否将其转发到您的主页:

RequestDispatcher rd = request.getRequestDispatcher("/index.html"); rd.forward(request, response);

【讨论】:

    【解决方案2】:

    您只想提供静态文件(没有动态文件,JSP 文件)。

    您可以尝试从您的 web.xml 中删除所有 servlet 并使用 welcome-file-list 功能:

    <?xml version="1.0" encoding="utf-8"?>
    <!DOCTYPE web-app PUBLIC
     "-//Oracle Corporation//DTD Web Application 2.3//EN"
     "http://java.sun.com/dtd/web-app_2_3.dtd">
    
    <web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    
        <welcome-file-list>
            <welcome-file>index.html</welcome-file>
        </welcome-file-list>
    
    </web-app>
    

    试一试,如果可行,请告诉我。

    【讨论】:

    • 我了解sn-p。但我想为除 /js、/css、/img 之外的所有传入请求返回 index.html。我用更多信息更新了我的问题。
    • 不,它会抛出 The server has not found anything matching the request URI 错误。错误代码 - 404
    【解决方案3】:

    你可以使用拦截器。对于每个传入的请求,您可以将目标页面设置为您的 index.html

    【讨论】:

    • 谢谢,我按照你说的做了。像路径 /profile/xyz 一样提供 index.html 文件。但它正在请求 /profile/css/index.css 和 /profile/js/main.js。它抛出错误。它必须是 /css/index.css 和 /js/main.js。我认为,客户端是根据父 URL 请求的。我该如何解决这个问题?
    • 我没听懂你说的。您的 index.html 是否引用了 index.css 和 main.js 文件?您说您想将所有请求重定向到索引页面。你成功了吗?
    • index.html 有行 &lt;link href="css/index.css" rel="stylesheet"&gt; 在客户端正确接收到的 index.html 文件(我在 chrome 中看到了 Google Developer Tool -> network panel) 浏览器正在尝试检索css 文件作为 /profile/css/index.css 服务器端不存在实习生。它必须像 /css/index.css 一样请求。
    • 您的回答让 OP 感到困惑。 “拦截器”特定于 Struts,它是一个遗留的基于请求的 MVC 框架。但是 OP 根本没有使用 Struts。
    猜你喜欢
    • 2010-11-06
    • 2019-02-02
    • 2015-06-05
    • 2014-07-18
    • 2011-04-14
    • 2018-02-27
    • 1970-01-01
    • 2021-08-13
    • 2016-05-21
    相关资源
    最近更新 更多