从应用服务器获取的cookie数量是1吗?

时间:2015-02-21 17:02:08

标签: java-ee cookies web-applications application-server

通常,容器会将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());
            }
        }

以下是从不同服务器捕获的结果。

  
      
  1. VMware vFabric tc Server Developer Edition
  2.   
output : Cookie get name JSESSIONID, cookie get value 3B88AE51A991800566A4C3A05AC36C37
  
      
  1. Tomcat v7.0服务器
  2.   
Cookie get name JSESSIONID, cookie get value 115B310C64B68C3E25C49391236AE978
  
      
  1. Jetty服务器
  2.   
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或更多。

1 个答案:

答案 0 :(得分:1)

高级开发人员正确地改进了您的代码,因为应用程序服务器可能会发送多个cookie。它仅取决于满足您请求的Web应用程序;例如,您可以同时接收身份验证cookie(由JSESSIONID表示)以及persistent cookie。通过此改进,您的应用程序将发回所有收到的cookie。

例如,Web应用程序可能想要记住您在首次访问Web站点时选择的用户语言。这些信息应该由一个特殊的cookie带回来,该cookie不依赖于用户在网站之后是否经过身份验证。

  

我没有尝试使用其他应用程序服务器,但我想,其他   像Weblogic,GlassFish这样的应用服务器也会提供相同的服务   输出,即..,1个名为JSESSIONID的cookie。

那是对的。但是,如上所述,您可以与JSESSIONID一起接收其他类型的cookie。