我有一个Java应用程序(JDK 1.7.0_13),正在使用java.net.HttpURLConnection连接到一些基于servlet的服务,这些服务进行会话管理。我试图弄清楚如何使用java.net.CookieManager来跟踪会话cookie。阅读文档我得到的印象是,使用CookieHandler.setDefault(new CookieManager())安装CookieManager应该会导致cookie管理自动发生。然而,对同一网址的多个请求似乎并没有保留cookie。我必须手动从响应中提取cookie并在请求中重新发送它们吗?还是CookieManager会自动为我这样做?如果CookieManager没有,那么它会增加什么价值?
为了进行测试,我有一个servlet,每次浏览器访问URL时,它都会成功地增加一个计数器。这在Safari、FireFox和Chrome上都很好用。。。然而,我无法从独立的Java应用程序中使用它。
这里有一个非常简单的测试程序来说明我希望简单的工作。它在开始时安装CookieManager,然后在控制台输入网址时反复调用一个抓取(字符串urlString)方法。
package com.brilliant.experimental;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.HttpURLConnection;
import java.net.URL;
public class HttpFetcher {
public static void fetch(String urlString) {
try {
URL url = new URL(urlString);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
InputStream in = conn.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
int status = conn.getResponseCode();
System.out.println("Status = " + status);
String key;
System.out.println("Headers-------start-----");
for (int i = 1; (key = conn.getHeaderFieldKey(i)) != null; i++) {
System.out.println(key + ":" + conn.getHeaderField(i));
}
System.out.println("Headers-------end-----");
System.out.println("Content-------start-----");
String inputLine;
while ((inputLine = reader.readLine()) != null) {
System.out.println(inputLine);
}
System.out.println("Content-------end-----");
in.close();
} catch (Exception e) {
System.out.println(e);
}
}
public static void main(String[] args) {
CookieHandler.setDefault(new CookieManager());
for (int i = 0; i < args.length; i++) {
fetch(args[i]);
}
InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader reader = new BufferedReader(isr);
String prompt = "> ";
String urlString;
try {
for (System.out.print(prompt);
(urlString = reader.readLine()) != null;
System.out.print(prompt))
{
fetch(urlString);
}
} catch (IOException ioe) {
System.out.println(ioe);
}
}
}
从这个应用程序调用我的servlet显然会从服务器返回一个会话cookie。然而,再次调用会得到一个新的会话cookie。
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaMp0uKke4gp9_-nUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:31 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
> http://localhost:8080/brilliant/TestServlet
Status = 200
Headers-------start-----
Server:Resin/4.0.34
Cache-Control:private
Set-Cookie:JSESSIONID=aaaZ-oPaC1I9WdEDoUuZt; path=/
Content-Length:19
Date:Wed, 13 Feb 2013 18:02:33 GMT
Headers-------end-----
Content-------start-----
Session count is 0
Content-------end-----
所以,总而言之,我需要做些别的事情来让CookieManager自动为我工作,还是必须求助于手动从响应中提取cookie,并用请求重新发送它们?
我运行你的代码并替换这个
CookieHandler.setDefault(new CookieManager());
通过
CookieHandler.setDefault( new CookieManager( null, CookiePolicy.ACCEPT_ALL ) );
成功了!
问题内容: 我有一个Java应用程序(JDK 1.7.0_13),正在使用java.net.HttpURLConnection连接到一些进行会话管理的基于servlet的服务。我试图弄清楚如何使用java.net.CookieManager跟踪会话cookie。阅读文档后,我得到的印象是,使用CookieHandler.setDefault(new CookieManager())安装Cookie
我应该在项目中使用,还是更好地使用?换句话说,什么时候使用每种方法更好?
null 有人知道解决这个问题的办法吗?提前感谢! 迈克尔
问题内容: 有什么方法可以保证应用程序不会在Oracle中释放行锁吗?如果我确保将commit语句放在finally块中,则可以处理意外错误的情况,但是如果应用程序进程在提交前突然中断(或者有人将电源线/局域网电缆拔出),该怎么办。 有没有办法让Oracle在X时间后自动回滚空闲会话?还是在我以某种方式检测到连接丢失时回滚? 根据我所做的实验,如果我在提交某个应用程序进程之前终止了该进程,则行锁将
问题内容: 我有一个表,该表具有指向两个不同表的两个外键,两个外键 共享一个列 : 如您所见,有两个FK共享country_code(恰好在引用路径的末尾引用同一列)。实体类看起来像(JPA 1.0 @IdClass): 如您所见,我将countryCode属性和城市的country_code @JoinColumn标记为只读(insertable = false,可更新= false)。Hibe
问题内容: 对于每个请求,您可以通过几种不同的方式来判断会话是否已经开始,例如: 要么: 但是,如果您启动会话然后将其关闭,它们都将失败。将返回前一个会话的ID,同时将对其进行定义。同样,如果您已经有一个活动会话,则此时调用将生成一个。有没有一种明智的方法来检查会话当前是否处于活动状态,而不必诉诸输出缓冲,关闭运算符()或其他类似hacky的方法? 编辑8/29/2011:向PHP 5.4添加了新