通常,容器会将Cookie作为响应的一部分发送。我在JSF中创建了一个简单的登录表单,并尝试将其提交给JSF bean。
在我的bean的action方法中,我试图使用以下代码检索从服务器获取的cookie。
FacesContext ctx = FacesContext.getCurrentInstance();
Map cookieMap = ctx.getExternalContext().getRequestCookieMap();
据我所知,我知道我们得到一个cookie,即JSESSIONID。我已经使用以下代码检查了一些服务器。
if (cookieMap != null && !cookieMap.isEmpty()) {
Iterator iterator = cookieMap.keySet().iterator();
while (iterator.hasNext()) {
Cookie cookie = (Cookie) cookieMap
.get((String) iterator.next());
System.out.printf("Cookie get name %s, cookie get value %s ",
cookie.getName(), cookie.getValue());
}
}
以下是从不同服务器捕获的结果。
- VMware vFabric tc Server Developer Edition
醇>
output : Cookie get name JSESSIONID, cookie get value 3B88AE51A991800566A4C3A05AC36C37
- Tomcat v7.0服务器
醇>
Cookie get name JSESSIONID, cookie get value 115B310C64B68C3E25C49391236AE978
- Jetty服务器
醇>
Cookie get name JSESSIONID, cookie get value 115B310C64B68C3E25C49391236AE978
根据以上统计数据,我已按以下方式编码,将cookie传递给url连接方法,如下所示。
private void openConnection(URL url, Cookie jsessionid){
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.disconnect();
conn.setUseCaches(false);
conn.setDefaultUseCaches(false);
conn.setDoOutput(true);
if (jsessionid != null) {
conn.addRequestProperty("Cookie", jsessionid.getName() + "="
+ jsessionid.getValue());
}
conn.connect();
//some other code
}
高级开发人员通过迭代地将cookie从CookieMap添加到RequestProperty来改进上面的代码片段,如下所示。
if(cookieMap !=null && !cookieMap.isEmpty()){
Iterator iterator = cookieMap.keySet().iterator();
while (iterator.hasNext()) {
Cookie cookie = (Cookie) cookieMap.get((String)iterator.next());
conn.addRequestProperty("Cookie",
cookie.getName() + "=" + cookie.getValue());
}
}
我没有尝试使用其他应用程序服务器,但我猜,其他应用程序服务器(如Weblogic,GlassFish)也会提供相同的输出,即...,1个名为JSESSIONID的cookie。如果我错了,请纠正我。我想知道从容器中获取的cookie数量是否为1或更多。
答案 0 :(得分:1)
高级开发人员正确地改进了您的代码,因为应用程序服务器可能会发送多个cookie。它仅取决于满足您请求的Web应用程序;例如,您可以同时接收身份验证cookie(由JSESSIONID表示)以及persistent cookie。通过此改进,您的应用程序将发回所有收到的cookie。
例如,Web应用程序可能想要记住您在首次访问Web站点时选择的用户语言。这些信息应该由一个特殊的cookie带回来,该cookie不依赖于用户在网站之后是否经过身份验证。
我没有尝试使用其他应用程序服务器,但我想,其他 像Weblogic,GlassFish这样的应用服务器也会提供相同的服务 输出,即..,1个名为JSESSIONID的cookie。
那是对的。但是,如上所述,您可以与JSESSIONID一起接收其他类型的cookie。