昨天跑了一下测试,发现服务器明明向客户端写了COOKIE,而且浏览器也木有禁用COOKIE,但是从浏览器再访问服务器,SessionID死活不会传到服务器。搞了一个上午,找不到原因,正在焦头烂额的时候,一个前辈帮了大忙。原来我的访问URL协议头是HTTP,而Weblogic里面的配置被人改动了。把cookie-secure的值改为了true,true意味着"指示浏览器仅通过 HTTPS 连接传回 cookie。这可以确保 cookie ID 是安全的,且仅用于使用 HTTPS 的网站。如果启用此功能,则 HTTP 上的会话 Cookie 将不再起作用。"唉,明白了,怪不得一直都取不到COOKIE。
好了,问题解决了,下面我自己再实验一下:
我自己的电脑用的Tomcat,首先,把cookie-secure的值设为false,创建一个session:
1 public void service(HttpServletRequest request, HttpServletResponse response) { 2 // 创建cookie 3 Cookie cookie = new Cookie("key", "value"); 4 // 关键地方:cookie设为false 5 cookie.setSecure(false); 6 response.addCookie(cookie); 7 // 从request中取得cookie,并输出 8 Cookie[] cookies = request.getCookies(); 9 for (Cookie c : cookies) { 10 System.out.println(c.getValue()); 11 } 12 RequestDispatcher dispatcher = request 13 .getRequestDispatcher("index.jsp"); 14 try { 15 dispatcher.forward(request, response); 16 } catch (ServletException e) { 17 e.printStackTrace(); 18 } catch (IOException e) { 19 e.printStackTrace(); 20 } 21 }
好,我们访问一下这个地址:http://localhost:8080/servlet/index.do
用Fiddler来看一下客户端发出的信息:
好,我们再访问一下前面的地址:
这个时候我们可以看到客户端发出的cookie里面,有key=value,说明客户端把cookie发给了服务器端。
那如果我们在服务器端设置cookie.setSecure(true)呢?
先上代码:
1 public void service(HttpServletRequest request, HttpServletResponse response) { 2 // 创建cookie 3 Cookie cookie = new Cookie("key", "value"); 4 // 关键地方:cookie设为false 5 cookie.setSecure(true); 6 response.addCookie(cookie); 7 // 从request中取得cookie,并输出 8 Cookie[] cookies = request.getCookies(); 9 if (cookies != null) { 10 for (Cookie c : cookies) { 11 System.out.println(c.getValue()); 12 } 13 } 14 RequestDispatcher dispatcher = request 15 .getRequestDispatcher("index.jsp"); 16 try { 17 dispatcher.forward(request, response); 18 } catch (ServletException e) { 19 e.printStackTrace(); 20 } catch (IOException e) { 21 e.printStackTrace(); 22 } 23 }
第一次访问:
这是request的信息。
服务器的返回信息如下:
我们可以看到服务器发给客户端的信息中有这么一行:Set-Cookie:key=value; Secure
多了一个Secure。
第二次访问:
我们发现key=value这个cookie已经没有了。
那我们用https协议头来试着访问一下看看:
我们看到key=value又发给了服务器端了。
唉,其实这些都是基础知识了,看来自己的只是还是很薄弱。继续努力吧。