Java 使用带有域和安全的 RestTemplate 设置安全 cookie

2024-01-20

除了下面的问题之外,我如何设置 Cookie 域并标记为“安全”?尝试在 Cookie 上设置其他属性。

使用 RestTemplate 设置安全 cookie https://stackoverflow.com/questions/5796078/setting-security-cookie-using-resttemplate

我正在尝试使用 RestTemplate 调用 Restful JSON 服务 杰克逊 json 转换器。现在为了调用该服务,我需要 传入安全 cookie。我可以通过使用 URLConnection 来实现这一点 (见下面的代码)

网址 url= 新网址("https://XXXXXXXX");

URLConnection yc = url.openConnection(); yc.setRequestProperty("SecurityCookie", ssocookie.getValue()); RestTemplate 中的相似之处是什么?这是一个代码片段 我一直用它来使用 RestTemplate 调用 Restful 服务:

RestTemplate 休息 = new RestTemplate(); InputBean 输入 = 新 输入Bean(); input.setResource("SampleResource");
HttpEntity 实体 = new HttpEntity(输入);
ResponseEntity 响应1 = rest.postForEntity( “https://XXXXXXXXX”, 实体,OutputBean.class);我不知道如何在使用 RestTemplate 调用服务时传递安全 cookie。任何 对此提供帮助会很棒。

答案示例:

https://stackoverflow.com/a/10080397/15435022 https://stackoverflow.com/a/10080397/15435022

HttpHeaders requestHeaders = new HttpHeaders();
requestHeaders.add("Cookie", "JSESSIONID=" + session.getValue());
HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
ResponseEntity rssResponse = restTemplate.exchange(
    "https://jira.example.com/sr/jira.issueviews:searchrequest-xml/18107/SearchRequest-18107.xml?tempMax=1000",
    HttpMethod.GET,
    requestEntity,
    Rss.class);
Rss rss = rssResponse.getBody();

假设

我假设您正在寻找一种使用基于 cookie 的身份验证来针对 REST 服务器进行身份验证的方法,基本上而不是访问网页。

此外,我假设您希望避免将您的 cookie 暴露给不应将 cookie 发送到的网站。

使用 cookie 进行服务器到服务器的通信是很不寻常的,但并非不可能(我之前已经破解过类似的东西)。不过,您想要做的听起来正是这样:从一台服务器设置/获取 cookie,然后在另一台服务器(您想要调用的 RESTful JSON 服务器)上存储和使用这些 cookie。我不太清楚您是否拥有设置 cookie 的服务器,以及这些 cookie 会在哪里使用,但我会尽力根据您目前告诉我们的内容给出一个好的答案。

基于 Cookie 的身份验证流程

既然你正在谈论 cookie 属性,例如Secure, HttpOnly, SameSite等等,你似乎想使用Set-Cookie标题某处。当客户端向服务器发出初始 HTTPS 请求时(这里稍微简化一下),此标头通常从服务器发送到客户端(通常是浏览器,但在您的情况下是 Spring 应用程序)。

The Cookie标头仅携带键值对(例如Cookie: JSESSIONID=...; YOURCOOKIE=...),客户端使用它来将 cookie 的存储值发送回服务器以供后续请求使用。哪些 cookie 是由浏览器根据 cookie 中的设置确定的SET-COOKIE他们从服务器收到的标头。

流程示例:

  1. 客户端向服务器发送 HTTPS 请求,例如GET https://subdomain.yourdomain.com/do/
  2. 在我们的示例中,服务器发送一个响应,其中包含正文中的页面 HTML(或者在您的情况下为 JSON)和一堆标头Set-Cookie: JSESSIONID=<cookie-value>; Domain=yourdomain.com; SameSite: Lax; Secure; HttpOnly(或者像 Content-Security-Policy 这样的标头可以比 SameSite 进行更细粒度的控制)。
  3. 客户端(通常是浏览器,但也可能是您的 Spring 应用程序)接收Set-Cookieheader 并存储它们(临时/在请求上下文中)以及所有 cookie 属性。
  4. 当向服务器发出另一个请求时,客户端仅将 cookie 作为键值对发送到Cookies标头。浏览器具有确定 cookie 是否随请求一起发送的规则(请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent)。如果您只想在 Spring 应用程序中发送正确的 cookie,这些附加属性可能不会产生任何效果,并且您需要自己模拟所有浏览器规则,或者只为您想要实际发送的 cookie 编写自定义逻辑。

你可以如何尝试让它发挥作用

Cookie 通常在浏览器中生成。浏览器(客户端)向 HTTP(S) 服务器发出请求并获取响应,并在响应标头中返回 Set-Cookie 属性。您可以对您的应用程序执行相同的操作,只需过滤掉您需要的 cookie。

浏览器通常会存储这些 cookie,您可以在该页面的浏览器的 DevTools 中看到它们。 (例如,请参阅此页面,了解如何在 Chrome 中执行此操作:https://developer.chrome.com/docs/devtools/application/cookies/ https://developer.chrome.com/docs/devtools/application/cookies/)。您的 Spring 应用程序需要将这些 cookie 存储在 Spring 上下文中的某个位置。有关更多详细信息,如果您想重用服务器请求中的 cookie,也许这会有所帮助:带 cookie 的 RestTemplate 客户端 https://stackoverflow.com/questions/22853321/resttemplate-client-with-cookies)

要指定一个 cookie 来指定它对哪些域、路径等有效,您可以使用以下内容的组合作为Set-CookieHttpHeader 中的字段,例如Domain, Path, SameSite(有关每个属性的详细信息,请参见https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie)。您可以在此处了解浏览器验证规则的工作原理:https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#define_where_cookies_are_sent

RestTemplate示例代码

为了在您的restTemplate请求中使用这些cookie,您可以使用以下代码(基于您的代码示例):

HttpHeaders requestHeaders = new HttpHeaders();

ResponseCookie cookie = new ResponseCookie("JSESSIONID", session.getValue() + "; HttpOnly; Secure; SameSite=Strict/Lax; Domain: yourdomain.com");
requestHeaders.add(cookie);

HttpEntity requestEntity = new HttpEntity(null, requestHeaders);
ResponseEntity rssResponse = restTemplate.exchange(
    "https://jira.example.com/sr/jira.issueviews:searchrequest-xml/18107/SearchRequest-18107.xml?tempMax=1000",
    HttpMethod.GET,
    requestEntity,
    Rss.class);
Rss rss = rssResponse.getBody();

根据您使用的 Spring 版本,此代码可能适合您,也可能不适合您。如果有更多详细信息,我可能会更新我的回复

进一步阅读:

  • https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpEntity.html https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpEntity.html

  • 如何建造Set-Cookie标头:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/ResponseCookie.ResponseCookieBuilder.html https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/ResponseCookie.ResponseCookieBuilder.html

  • 如何建造Cookie标头:https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpCookie.html https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/http/HttpCookie.html

结束语

这是我在 StackOverflow 上的第一个回答,我知道它有点长。让我知道什么是有帮助的,也许有更多的背景信息,我也许可以根据您的需求稍微调整/简化它。当我不得不做和你类似的事情时,我最近学到了很多关于cookie的知识,所以我希望它能有所帮助。

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

Java 使用带有域和安全的 RestTemplate 设置安全 cookie 的相关文章

随机推荐

  • 通过注释抑制 IntelliJ IDEA 中的重复警告

    从版本 15 开始 IntelliJ 警告我有关代码重复的问题 https www jetbrains com help idea 2016 1 analyzing duplicates html origin old help 在某些情况
  • 如何在android中点击按钮打开下面的自定义布局对话框?

    我想在点击按钮下方创建下拉自定义对话框 单击计数器按钮 布局将显示在按钮下方 我看到了很多链接 但他们只打开列表 操作栏下拉打开和关闭项目样式 https stackoverflow com questions 15824793 actio
  • 如何在 Python 中创建通用接口?

    我想在 Python 中创建与此等效的内容 static class Event static class MyEvent extends Event interface Filter
  • React / Redux:mapStateToProps 实际上并未将状态映射到 props

    我在一个项目中使用 React 和 Redux 但在实现启用 禁用按钮的功能时遇到问题 我已经能够 触发一个方法 让该方法触发动作创建者 调度一个动作 在减速器中捕获该操作并创建一个新的更新状态 在 Redux DevTools 中查看更新
  • 在 for 循环中引用/取消引用向量元素

    在下面的代码中 我想保留number list 迭代之后 因为 into iter that for默认使用会消耗 因此 我假设n i32我可以获得的值n通过解除引用 fn main let number list vec 24 34 10
  • 如何在JTable中添加JCheckBox?

    首先 我为我的英语疏忽表示歉意 我将解释我所有的问题 首先我想在我拥有的 JTable 中使用 JCheckBox 我正在从数据库的列索引 0 和 1 中检索学生 ID 和学生姓名 我希望第三列应该是缺席 在场 最初将通过 JCheckbo
  • TinyMCE - 附加到通过 AJAX 调用加载的 div

    我知道以前有人问过这个问题 但我正在尝试通过 jQuery AJAX 加载一些附加到 tinymce 实例的 div 在AJAX加载的页面中 有几个tinymce div 它们是由PHP循环创建的 div p Some text p div
  • 无法在 C# 中使用 Sendkeys 发送下划线?

    我很无聊 所以我尝试编写一个程序 在按 ctrl shift L 时写出不赞成的笑脸 脸 现在一切正常 除了笑脸中的下划线 它根本不会被写出来 这是我首先使用的 SendKeys Send 我尝试过各种方法 比如在下划线周围添加 括号 当然
  • R/Igraph 在边列表中显示边权重?

    当将图形对象作为边列表查看时 有什么方法可以显示边权重吗 我想本着以下精神做一些事情 get edgelist graph attr weight 以便查看与节点旁边列出的权重的边缘配对 但这似乎是不允许的 我知道如何查看权重的唯一方法是将
  • iPhone:当其他视图存在ViewController时如何防止关闭键盘

    我的 iPhone 应用程序出现问题 有一个 2UIViewController First UIViewController with UITextField和键盘向上 一旦我将打开其他UIViewController有了presentV
  • 为什么我需要在 swift 中使用下划线?

    Here https www weheartswift com tuples enums 它说 注意 意思是 我不关心那个值 但是来自 JavaScript 我不明白这意味着什么 我可以打印这些函数的唯一方法是在参数之前使用下划线 func
  • Rx.Net - 处理 Observable.Create() 期间创建的资源

    我正在尝试将 Rx net 用于项目 但我遇到了如何正确处置在Observable Create 并发出OnNext 我的设置如下所示 希望仅缩短到相关位 var obs Observable Create
  • 设置gunicorn与systemd一起运行

    正在尝试设置gunicorn与一起运行systemd 控制文件是 etc systemd system gunicorn service测试的输出是 root samuel pc systemctl start gunicorn Faile
  • git Notes 是将类别样式信息添加到提交的预期方法吗?

    答案是我可以将元数据添加到 git 提交吗 或者我可以在 gitk 中隐藏一些标签吗 https stackoverflow com questions 2683248 can i add metadata to git commits o
  • 这段代码定义明确吗?

    这段代码取自正在进行的讨论here https stackoverflow com questions 4638364 undefined behavior and sequence points reloaded 4638718 4638
  • 如何每周发送 100,000 封电子邮件? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何从 AJAX 请求返回值? [复制]

    这个问题在这里已经有答案了 我有一个函数声明一个变量var关键词 然后 它启动 AJAX 请求来设置变量的值 然后从函数返回该变量 然而 我的实施失败了 我不知道为什么 这是代码的简化版本 function sendRequest some
  • Swift:转换到新场景后取消分配 GameScene?

    所以我读过几个关于这个问题的问题 但大多数都是 Objective C 的 我还没有找到任何直接解决 回答这个问题的问题 我是这里编程的新手 所以请彻底解释任何建议 我需要了解如何解除分配游戏结束后我的游戏场景到达 我需要这样做的原因是因为
  • GridBagLayout 网格化不起作用

    我正在尝试创建以下 GUI 但我制作的 GUI 是 我的网格是什么样的 image 网格布局 https i stack imgur com Wpzna png 我不明白为什么我会得到这个输出 因为我已经绘制了一个图表来帮助代码并且它似乎可
  • Java 使用带有域和安全的 RestTemplate 设置安全 cookie

    除了下面的问题之外 我如何设置 Cookie 域并标记为 安全 尝试在 Cookie 上设置其他属性 使用 RestTemplate 设置安全 cookie https stackoverflow com questions 5796078