我有一个使用 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/