Spring Boot 应用程序中 Thymeleaf HTML 页面转发到外部网站的问题

2024-01-02

我创建了一个 Spring Boot 应用程序,在其中我从外部 API 获取数据,将它们存储在数据库中,然后使用 Thymeleaf 在 HTML 中将它们显示在前端。除了一件事之外,一切都工作得很好。

db 中的列之一的名称为“HEADLINE”,它映射为字符串变量并包含新闻标题。我将此列值用作 Spring Boot 应用程序中的文本超链接,并与存储在同一数据库(“news_link”列)中的 URL 相结合,以重定向到它们的源。下面我展示我的前端代码。

前端页面

<!DOCTYPE HTML>
<html lang="en" xmlns:th="http://www.thymeleaf.org" xmlns:c="http://www.w3.org/1999/XSL/Transform">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">

    <title>Spring Boot Thymeleaf Hello World Example</title>

    <link rel="stylesheet" th:href="@{/webjars/bootstrap/css/bootstrap.min.css}"/>
    <link rel="stylesheet" th:href="@{/styles/db.css}"/>
    <script type="text/javascript" th:src="@{/webjars/bootstrap/js/bootstrap.min.js}"></script>

</head>

<body>

<ul>
    <li><a href="http://localhost:8080/">Home</a></li>
    <li><a href="https://github.com/Andreas-Kreouzos">Github</a></li>
</ul>

<main role="main" class="container">

    <div class="starter-template">
        <h1>IoT Application</h1>
    </div>

</main>
    <!--Display DB contents on HTML and Thymeleaf-->
    <div class="container text-center" id="tasksDiv">
        <h3>Database Contents</h3>
        <hr>
        <div class="table-responsive">
            <table class="table table-striped table-bordered">
                <thead>
                <tr>
                    <th>news_id</th>
                    <th>news_provider_name</th>
                    <th>HEADLINE</th>
                    <th>news_link</th>
                    <th>related_image</th>
                    <th>Timestamp</th>
                </tr>
                </thead>
                <tbody>
                    <tr th:each="rate: ${rates}">
                        <td th:text="${rate.news_id}"> </td>
                        <td th:text="${rate.news_provider_name}"> </td>
                        <td th:text="${rate.HEADLINE}"> </td>
                        <td> <a th:href="${rate.news_link}"> <p th:text="${rate.HEADLINE}"> </a> </td>
                        <td> <img th:src="${rate.related_image}" alt="error displaying image"> </td>
                        <td th:text="${rate.timestamp}"> </td>
                    </tr>
                </tbody>
            </table>
        </div>
    </div>


</body>
</html>

当我运行我的应用程序时,一切都显示得很好,但是一旦我按下文本超链接,我就会被重定向到主页,而不是我存储在数据库中的给定 URL。下面,我向您展示了我的打印屏幕,当我在浏览器中将光标悬停在 URL 上方时,就在按下 URL 之前,您肯定可以看到 URL 已被正确获取和分配。但一旦他们受到压力,我就会被重定向here https://www.investing.com/, 代替here https://www.investing.com/news/cryptocurrency-news/tether-liquidates-celsius-position-with-no-losses-to-stablecoin-issuer-2845626.

关于我做错了什么有什么想法吗?

UPDATE

我试图改变th:href="${rate.news_link} to th:href="@{${rate.news_link}}但仍然没有任何效果。例如,如果我的初始 URL 是

https://www.investing.com/news/cryptocurrency-news/tether-liquidates-celsius-position-with-no-losses-to-stablecoin-issuer-2845626

被砍掉https://www.investing.com/

UPDATE 2

我创建了以下控制器,但我得到空 URL ->http://localhost:8080/null

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
    public ModelAndView method(
            @RequestParam(name = "news_link", required = false) String news_link) {
        return new ModelAndView("redirect:" + news_link);
    }

我创建了一个具有两种方法的控制器:

@GetMapping("/hello")
    public String hello(Model model) {
        model.addAttribute("message", "Hello World!");

       //I have set below manually just for demo, but in real code, you can fetch this details from database & then set.      
        model.addAttribute("news_linkvalue", "https://www.investing.com/news/cryptocurrency-news/tether-liquidates-celsius-position-with-no-losses-to-stablecoin-issuer-2845626");
        
        return "helloworld";
    }

@RequestMapping(value = "/redirect", method = RequestMethod.GET)
    public ModelAndView method(@RequestParam(name = "news_link", required = false) String news_link) {
         
        return new ModelAndView("redirect:" + news_link);
    }

然后在helloworld.html我使用了下面的锚标记:

<p><a th:href="@{/redirect(news_link=${news_linkvalue})}">Click here</a></p>

启动 Spring Boot 后http://localhost:8080/hello当我点击Click here选项,它将转到主页https://www.investing.com/ https://www.investing.com/和给予HTTP 301当我点击链接时做出回应。

通过单击可以查看此行为network->点击第一条记录->Headers部分。

这主要意味着,站点正在阻止任何跨源不安全请求(即源自具有以下属性的域的请求):http协议)到除主页之外的特定页面。

如果您使用任何在线 javascript 编辑器或 stackoverflow 编辑器,对特定页面使用相同的锚标记,它将加载,因为请求来自安全来源 (https),​​示例如下:

<!DOCTYPE html>
<html>
<body>


<p>Checking Cross origin requests </p>
<p><a href="https://www.investing.com/news/cryptocurrency-news/tether-liquidates-celsius-position-with-no-losses-to-stablecoin-issuer-2845626">Click</a></p>
</body>
</html>

这主要意味着,只有当且仅当访问特定页面时协议安全级别相同(即 HTTPS)时,才能访问该站点的特定页面(主页除外)。

本地spring boot使用默认http协议&这就是当我们访问该网站的特定页面时,我们总是重定向到主页的原因。

如何修复:

  1. 检查您是否可以运行本地 spring boot 代码https(即通过单向身份验证或相互身份验证启用 ssl)。您可以在线找到一些使用 Spring Boot 和安全 http 的示例。

  2. 您可以根据可用性将应用程序部署到任何安全的应用程序服务器或任何云环境,并检查在非本地环境上运行应用程序是否可以解决此问题。您的应用程序网址必须可通过以下方式访问https here.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Boot 应用程序中 Thymeleaf HTML 页面转发到外部网站的问题 的相关文章

随机推荐

  • WPF:如何设置垂直滑块的动态数字范围?

    我目前正在处理一个 WPF MVVM 项目 该项目有一个由多个视图使用的用户控件 但具有不同的值范围 这是我需要的一个例子 正如您所看到的 控件必须根据我需要在滑块中显示的值以不同的行为做出响应 无论数字如何 这只是一个示例 问题之一是该项
  • 为什么在 C++ 中对模板施加类型约束是不好的?

    In 这个问题 https stackoverflow com questions 874298 c templates that accept only certain typesOP询问限制模板将接受哪些类 总结一下 Java 中的同等
  • 在 ListView 上对齐两个 TextView,一左一右,而不拉伸背景

    所以我有两个TextViews每行ListView 一个应该左对齐 另一个右对齐 两个都TextViews有一个圆角矩形作为背景 应该将文本包裹在里面 所以我想出了这个
  • Flutter 应用程序在发布模式下不会请求存储权限

    我正在使用permission handler包来请求我的应用程序中存储的读取权限 在调试模式下一切都工作正常 当我使用 flutter run release 运行我的代码时 但是当我将代码导出为apk时 问题就出现了不出现权限对话框 我
  • 托管调试助手发生“FatalExecutionEngineError”

    i got the following error while DEBUG a test however the same test can RUN successfully 当我在 工具 gt 选项 gt 调试 gt 常规 下打开 使用托
  • 当前时间的时区缩写?

    有没有办法可以使用时区缩写 PST EDT GMT 等 并在 WP7 上使用 C 将其转换为当前时间 我假设我可以使用像 TimeZoneInfo 这样的东西来查找偏移量 但实际上如何从缩写或完整时区名称 通过将缩写映射到全名来获取 中获取
  • 从 unsigned int (C++) 读取最左边位的最快方法?

    从 unsigned int 读取最左边位的最快方法是什么 i gt gt sizeof unsigned int CHAR BIT 1 The sizeof 乘法和减法将由任何合理的编译器在编译时计算 因此这应该成为单个右移指令 这大约是
  • 在 FrameLayout 内显示空 ListView 的 TextView

    我有一个选项卡式布局和一个使用选项卡作为视图的活动 它有三个选项卡ListViews 如果其中一个列表为空 我想显示一个简单的TextView反而 我浏览了很多帖子 但它们都只讨论一个ListView里面一个LinearLayout 我不确
  • 将单列转换为单行

    我有一个只有一列的表 如下所示 Column Name Data1 Data2 Data3 Data4 Data5 我想做的事情看起来很简单 但我无法在任何地方找到任何例子 我想要的只是将上面的列转换为单行 如下所示 Col1 Col2 C
  • 灯箱叠加层在 Chrome 上不显示,但在 Chrome Canary 上运行良好

    我在 Lightbox Overlay 上遇到了一些问题 它在 Chrome Canary Safari Firefox 和 IE 上完美显示 Chrome 版本 33 除外 截图 Lightbox 适用于除 Chrome 之外的任何浏览器
  • 将 JavaScript 生成的 SVG 转换为文件

    我正在使用 d3 js 来可视化一些数据 我希望能够获取它生成的 SVG 代码并将其存储为 svg图像文件 用于在 Inkscape Illustrator 中编辑 我尝试简单地复制 svg 标签的内容 即
  • 使用 glob 返回给定目录中的文件夹列表(不带路径)

    下面的函数将给定目录中的所有文件夹返回到多个级别 不过 我只需要一层深度 只需要目标目录中的文件夹 不需要子文件夹 该函数还返回文件夹的完整路径 我只想要文件夹名称 我确信我错过了一些简单的事情 如何修改函数以仅返回给定目录的文件夹名称 不
  • Boot2Docker:通过 LAN 连接到容器

    我在 Mac 上使用 Boot2Docker 1 3 0 到目前为止我很高兴使用它 但现在我想不是从本地计算机而是从本地网络中的另一台计算机连接到 http 容器 公开端口 8080 如果我在本地进行 我只需使用http 192 168 5
  • 在制表符中显示/隐藏或切换嵌套表子项

    我想知道你是否可以帮忙解决一些我认为非常简单的事情 使用制表符嵌套表示例 不是树 如何使子表在单击时显示 隐藏 我希望用户能够在需要类似于树示例的情况下扩展以获取更多信息 我已经看到了一些答案 但它们似乎对我不起作用 define tabl
  • 更改java符号链接

    My Windows 8命令提示符不再显示 java 我发现在C ProgramData Oracle Java javapath找到了我无法更改的错误符号链接 当我尝试更改时出现错误 Problem with Shortcut The n
  • 循环遍历对象数组 - TypeError:无法读取未定义的属性“名称”

    我正在尝试从以下位置创建一串艺术家姓名artists下面显示的数组 即 泰勒 斯威夫特 蕾哈娜 贾斯汀 汀布莱克 但是artist obj未定义 我收到错误 TypeError 无法读取未定义的属性 名称 我该如何解决 Code Get i
  • 如何创建像新市场或Google+这样的UI?

    我想知道是否有一种 官方 方式来创建与新版具有相同设计的 Android 应用程序或 Google 应用程序 我的意思是可以向左 向右滑动来更改视图 将列表放在顶部等等 任何 Android 用户可能都明白我的意思 如果没有官方方法 您对如
  • 删除 Cython 中的编译参数

    我想用 cython 编译我的 python 项目 我创建了这个 setup py 文件 from setuptools import setup find packages from Cython Build import cythoni
  • Dynamics CRM OData 查询过滤扩展属性仅在没有结果出现时才起作用?

    我有一个要求来获取Price List Item符合以下要求的记录 按特定价目表过滤 按特定货币过滤 过滤条件为Name相关的Product包含给定字符串 我的前两点工作没有问题 但感觉扩展不能很好地应对过滤 我从 直接 查询开始Produ
  • Spring Boot 应用程序中 Thymeleaf HTML 页面转发到外部网站的问题

    我创建了一个 Spring Boot 应用程序 在其中我从外部 API 获取数据 将它们存储在数据库中 然后使用 Thymeleaf 在 HTML 中将它们显示在前端 除了一件事之外 一切都工作得很好 db 中的列之一的名称为 HEADLI