java - 如何在使用基于表单的 spring 安全性对 Java 应用程序进行身份验证后使用 Apache HttpClient 保留 cookie

标签 java spring security authentication cookies

我有一个使用 Spring(MVC、安全、事务等)构建的 Java 应用程序( jetty 服务器),并将 REST 用于 Web 服务。我有另一个 Java 客户端,它使用 Apache HTTPClient (HttpComponents) 对服务器进行 REST 调用。服务器应用程序使用基于表单的身份验证,Web 客户端使用 j_spring_security_check 表单登录到应用程序。因此,我从 Java 客户端使用 [https://host:port/myapp/j_spring_security_check?j_username=myuser&j_password=mypass] 使用 POST 进行登录。身份验证工作正常(它到达 UserDetailService 的子类并成功执行身份验证),但后续 REST 调用失败表明用户未通过身份验证(调用甚至没有到达给定 rest 调用的 Controller 方法)。我取回应用程序的 html 页面之一(这是 jsp 页面之一)。

我正在为每个请求(包括登录)打印 Cookie,它为每个请求打印不同的 jsessionid(请求是对服务器的其余调用)。这里是cookies,每个请求一个,第一个请求是登录请求(看每个请求的jsessionid是不同的):

cookies: [[version: 0][name: JSESSIONID][value: 1x5i3b0lbf5o7xv52kjh0vu89][domain: 127.0.0.1][path: /webui][expiry: null]]
cookies: [[version: 0][name: JSESSIONID][value: t05vbrffqv6t1xcygps9l6jaz][domain: 127.0.0.1][path: /webui][expiry: null]]
cookies: [[version: 0][name: JSESSIONID][value: 8v5i5ofbgr201kh2txxale674][domain: 127.0.0.1][path: /webui][expiry: null]]

问题/原因是每个请求的不同 jsessionid 吗?我该如何解决这个问题?这是带有 HttpClient 的代码:

    request = new HttpPost(url);
    httpClient = new DefaultHttpClient();        

    httpClient.getConnectionManager().getSchemeRegistry().register(new Scheme("https", 443, socketFactory));

    HttpResponse response = httpClient.execute(request);
    System.out.println("cookies: " + httpClient.getCookieStore().getCookies());
    HttpEntity resp_ent = response.getEntity();
    this.status_code = response.getStatusLine().getStatusCode();

我们需要做任何特殊的事情来存储 cookies 吗?非常感谢任何帮助。

最佳答案

从您显示的代码片段中看不出来,所以我不确定这是否是问题所在,但请确保您没有为每个请求创建一个 new DefaultHttpClient(),否则新客户端将有一个新的 CookieStore

关于java - 如何在使用基于表单的 spring 安全性对 Java 应用程序进行身份验证后使用 Apache HttpClient 保留 cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15304433/

相关文章:

Java 小程序重新加载

java - 测试 Spring Boot 命令行应用程序

node.js - org.springframework.web.multipart.MultipartException : Could not parse multipart servlet request. ..流意外结束

java - Flex Java BlazeDS 仪表板——使用 Spring/JDBC 还是 Hibernate?

javascript - 同源策略导致从 www.example.com 到 example.com 的 Ajax 请求被拒绝?

java - 通过LAN网络(java)发送和监听swing事件?

java - 如何在 java 中返回对象数组?

git - 使用 `git config --global credential.helper ' 缓存的 git 凭据缓存有多安全?

jquery - 可以使用 firebug 修改 jquery/javascript 运行时,例如扰乱验证器吗?

java - 测试 MySQL/MariaDB JDBC 驱动程序错误时出错