【问题标题】:Sparkjava redirect while keeping the browser URLSparkjava 重定向,同时保留浏览器 URL
【发布时间】:2019-09-17 23:52:39
【问题描述】:

我有一个 sparkjava 服务器应用程序正在运行,它使用此行提供静态 HTML 页面:

staticFiles.location("/public");

如果您转到http://example.com,您将看到 HTML 页面。现在,我想将用户从其他路径重定向到我的主页,同时保留浏览器 URL。例如,如果您访问http://example.com/message/123,您仍将看到 HTML 页面,而浏览器 URL 仍为 http://example.com/message/123。所以 redirect.get() 在这里不起作用。

【问题讨论】:

  • 为什么不能只为其他非主页路径提供相同的 HTML 页面?
  • 我使用 staticFiles.location("/public");在默认位置“/”提供静态内容。有没有办法在不同的地方也提供服务?

标签: spark-java


【解决方案1】:

为了从不同的路径提供同一个文件,你可以这样做(看起来很长但很简单):

假设你的项目结构是:

src
  java
    main
      resources
        public
        templates   (optional folder)

GET 向您的主页请求一个位于/public 中的静态HTML 文件。我们称这个文件为index.html

现在您要注册其他路径来提供此文件。如果您使用 TemplateEngine,您可以轻松完成。实际上,您将引用index.html 作为静态文件和模板(不带参数)。

模板引擎允许您通过传递一个键值对映射来动态创建提供的 HTML 页面,您可以在运行时在模板中引用该映射。但是在您的情况下,它会简单得多,因为您想按原样静态地提供页面。因此,您将传递一个空地图:

Spark.get("/message/123", (req, res) ->
    new ModelAndView(new HashMap(),
                     "../public/index"),
                     new ThymeleafTemplateEngine()
);
  • Thymeleaf 只是一个例子,Spark 支持few template engines。对于它们中的每一个,您都可以在文档中找到一个简单的 github 示例来说明如何使用它。例如,This is Thymeleaf。
  • ../public/index 路径是因为 Spark 在 templates 文件夹中查找模板,并且您希望将 public/index.html 定位为模板。
  • 您可以在 github 链接中找到 ThymeleafTemplateEngine 类。
  • 当然,您必须将所选模板引擎依赖项添加到项目的pom.xml 文件中。

因此,GEThttp://example.comhttp://example.com/message/123 的请求将在保留请求的 URL 的同时为 index.html 提供服务。

【讨论】:

  • 效果很好!谢谢!
  • @SHG 我可以在不使用模板引擎的情况下执行此操作吗,模板引擎似乎与问题没有太大关系?
  • @PaulTaylor 您是否也对不得更改的 URL 有相同的限制(就像 OP 一样)?因为如果你不这样做,你可以使用正常的重定向。
  • @SHG 是的,我有同样的限制
  • @PaulTaylor 我试图寻找更优雅的解决方案,但找不到任何使用 Spark Java 功能的东西。您可以使用许多其他重定向方法,但这些方法超出了 Spark Java 范围。我同意这可能是一个不错的功能。
【解决方案2】:

您可以将 index.html 文件读入字符串并提供给它。这就是我最终要做的。

如果您的应用程序从已编译的 .class 文件运行:

URL url = getClass().getResource("public/index.html");
String indexDotHTML = new String(Files.readAllBytes(Paths.get(url.toURI())));

get("/message/123", "text/html", (req, res) -> indexDotHTML);

如果您的应用程序从 jar 中运行:(解决方案使用 Guava 作为助手)

import com.google.common.io.ByteStreams;


InputStream in = getClass().getResourceAsStream("/public/index.html");
String indexDotHTML = new String(ByteStreams.toByteArray(in));

get("/message/123", "text/html", (req, res) -> indexDotHTML);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-04-30
    • 2021-03-30
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2018-11-18
    相关资源
    最近更新 更多