`

Cookie 跨域访问转自(http://qingfeng825.javaeye.com/)

    博客分类:
  • java
阅读更多
由于要做一个简单的SSO,所以学习了cookie部分,原来感觉Cookie很简单,无非就是将cookie写入response,再从request中读出来,作DEMO练习了一下,发现有好多细节得注意。



大体思路:写两个servlet,一个写入cookie,一个读出cookie,看到很多人用以下代码:
Java代码

   1. response.addCookie(cookie); 
   2.  javax.servlet.http.Cookie[] diskCookies = request.getCookies();      
   3.           for(int i=0;i<diskCookies.length;i++){ 
   4.               Cookie cookie=diskCookies[i]; 
   5.               System.out.println( "cookie[0].getName()== "+cookie.getName());  
   6.               System.out.println( "cookie[0].getValue()== "+cookie.getValue());  
   7.               System.out.println( "cookie[0].getDomain() "+cookie.getDomain()); 
   8.                
   9.           } 

response.addCookie(cookie);
javax.servlet.http.Cookie[] diskCookies = request.getCookies();
  for(int i=0;i<diskCookies.length;i++){
  Cookie cookie=diskCookies[i];
  System.out.println( "cookie[0].getName()== "+cookie.getName());
          System.out.println( "cookie[0].getValue()== "+cookie.getValue());
          System.out.println( "cookie[0].getDomain() "+cookie.getDomain());
 
  }



也就是在写入cookie后马上读取,进行测试,当然读不到,因为request内容没有刷新,要读到也是历史内容,所以还是使用 response.sendRedirect("ReadCookie");转到下一个servlet进行测试吧,另外,网上有简单的cookie查看工具,还蛮好用,在附件中可以下载。



好了,开始看代码:

1、写cookie的servlet
Java代码

   1. package test; 
   2.  
   3. import java.io.IOException; 
   4.  
   5. import javax.servlet.ServletException; 
   6. import javax.servlet.http.Cookie; 
   7. import javax.servlet.http.HttpServlet; 
   8. import javax.servlet.http.HttpServletRequest; 
   9. import javax.servlet.http.HttpServletResponse; 
  10.  
  11. /*@author:duanqf*/ 
  12. public class TestCookie extends HttpServlet { 
  13.     protected void doGet(HttpServletRequest request, 
  14.             HttpServletResponse response) throws ServletException, IOException { 
  15.         // 如果不设置域,cookie不会写入 
  16.         // 如果设为localhost也不会写入 
  17.         // cookie.setDomain("localhost"); 
  18.         // 设置域为IP时,写入IP的域中,利用http://172.20.40.73:8088/SSOAuth/TestCookie访问可以读出 
  19.         // 利用http://localhost:8088/SSOAuth/TestCookie访问读不出来。 
  20.         Cookie cookie = new Cookie("duanqftest", "22222"); 
  21.         cookie.setDomain("172.20.40.73"); 
  22.         cookie.setMaxAge(60000); 
  23.         cookie.setPath("/"); 
  24.         response.addCookie(cookie); 
  25.         javax.servlet.http.Cookie[] diskCookies = request.getCookies(); 
  26.         response.sendRedirect("ReadCookie"); 
  27.  
  28.     } 
  29. } 

package test;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*@author:duanqf*/
public class TestCookie extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// 如果不设置域,cookie不会写入
// 如果设为localhost也不会写入
// cookie.setDomain("localhost");
// 设置域为IP时,写入IP的域中,利用http://172.20.40.73:8088/SSOAuth/TestCookie访问可以读出
// 利用http://localhost:8088/SSOAuth/TestCookie访问读不出来。
Cookie cookie = new Cookie("duanqftest", "22222");
cookie.setDomain("172.20.40.73");
cookie.setMaxAge(60000);
cookie.setPath("/");
response.addCookie(cookie);
javax.servlet.http.Cookie[] diskCookies = request.getCookies();
response.sendRedirect("ReadCookie");

}
}

2、读出cookie的代码
Java代码

   1. package test; 
   2.  
   3. import javax.servlet.http.Cookie; 
   4. import javax.servlet.http.HttpServlet; 
   5. import javax.servlet.http.HttpServletRequest; 
   6. import javax.servlet.http.HttpServletResponse; 
   7.  
   8. /*@author:duanqf*/ 
   9. public class ReadCookie extends HttpServlet{ 
  10.       protected void doGet(HttpServletRequest request, HttpServletResponse response){ 
  11.           javax.servlet.http.Cookie[] diskCookies = request.getCookies();     
  12.           for(int i=0;i<diskCookies.length;i++){ 
  13.               Cookie cookie=diskCookies[i]; 
  14.               System.out.println( "cookie[0].getName()== "+cookie.getName());  
  15.               System.out.println( "cookie[0].getValue()== "+cookie.getValue());  
  16.               System.out.println( "cookie[0].getDomain() "+cookie.getDomain()); 
  17.                
  18.           } 
  19.       } 
  20. } 

package test;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/*@author:duanqf*/
public class ReadCookie extends HttpServlet{
  protected void doGet(HttpServletRequest request, HttpServletResponse response){
  javax.servlet.http.Cookie[] diskCookies = request.getCookies();
  for(int i=0;i<diskCookies.length;i++){
  Cookie cookie=diskCookies[i];
  System.out.println( "cookie[0].getName()== "+cookie.getName());
          System.out.println( "cookie[0].getValue()== "+cookie.getValue());
          System.out.println( "cookie[0].getDomain() "+cookie.getDomain());
 
  }
  }
}



javax.servlet.http.Cookie有两个比较重要的方法:setDomain()、setPath()



正常的cookie只能在一个应用中共享,即一个cookie只能由创建它的应用获得。


1.可在同一应用服务器内共享方法:设置cookie.setPath("/");
本机tomcat/webapp下面有两个应用:webapp_a和webapp_b,
1)原来在webapp_a下面设置的cookie,在webapp_b下面获取不到,path默认是产生cookie的应用的路径。


2)若在webapp_a下面设置cookie的时候,增加一条cookie.setPath("/");或者cookie.setPath("/webapp_b/");

就可以在webapp_b下面获取到cas设置的cookie了。


3)此处的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如tomcat下面的webapp),因此 cookie.setPath("/");之后,可以在webapp文件夹下的所有应用共享cookie,而cookie.setPath(" /webapp_b/");

是指cas应用设置的cookie只能在webapp_b应用下的获得,即便是产生这个cookie的webapp_a应用也不可以。


4)设置cookie.setPath("/webapp_b/jsp")或者cookie.setPath("/webapp_b /jsp/")的时候,只有在webapp_b/jsp下面可以获得cookie,在webapp_b下面但是在jsp文件夹外的都不能获得 cookie。


5)设置cookie.setPath("/webapp_b");,是指在webapp_b下面才可以使用cookie,这样就不可以在产生cookie的应用webapp_a下面获取cookie了


6)有多条cookie.setPath("XXX");语句的时候,起作用的以最后一条为准。



2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com");


A机所在的域:home.langchao.com,A有应用webapp_a
B机所在的域:jszx.com,B有应用webapp_b
1)在webapp_a下面设置cookie的时候,增加cookie.setDomain(".jszx.com");,这样在webapp_b下面就可以取到cookie。


2)输入url访问webapp_b的时候,必须输入域名才能解析。比如说在A机器输入:http://lc-bsp.jszx.com:8080/webapp_b,可以获取webapp_a在客户端设置的cookie,而B机器访问本机的应用,输入:http://localhost:8080/webapp_b则不可以获得cookie。


3)设置了cookie.setDomain(".jszx.com");,还可以在默认的home.langchao.com下面共享





疑问: 为什么我写cookie设置的城都是localhost,URL里也用localhost, 但是cookie写不进去??当然,也读不出来了。测试环境TOMCAT5.5 IE6.0
分享到:
评论

相关推荐

    ssh例子

    博文链接:https://qingfeng825.iteye.com/blog/142268

    解析XML

    博文链接:https://qingfeng825.iteye.com/blog/182494

    FreeCAD开发指南(FreeCAD_Mod_Dev_Guide__20170101-1)

    by Qingfeng Xia http://www.iesensor.com • 2015-09-18 version 0.1 for FreeCAD version 0.16-dev • 2016-09-18 version 0.2 for FreeCAD version 0.17-dev License of this book This ebook is licensed the ...

    validateClass.js

    elementui表单校验二次封装包

    uart wifi 串口wifi 程序 单片机可以用的串口wifi模块

    HLK-UART-WIFI is a WLAN Module based on UART Serial from Hi-Link. 1.1. Main Function ...本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qingfeng12g/archive/2010/03/07/5354341.aspx

    BLE_Demo(WinForm).rar

    蓝牙BLE WinForm示例程序(可执行文件),使用HC-42低功耗蓝牙模块BLE5.0连接成功,且收发数据正常,可用于简单的BLE蓝牙调试,支持Hex和字符串类型...https://blog.csdn.net/qingfeng_hero/article/details/120995069

    springboot 配置主从数据库涉及的各类细节 对初次解除主从数据库的开发

    #### 2.4.1 定义数据访问层 创建Repository接口继承JpaRepository,实现基本的CRUD操作: ```java public interface UserRepository extends JpaRepository, Long&gt; { } ``` #### 2.4.2 配置数据源路由策略 为了实现...

    CGI ghost 不关机备份系统

    纯64位一键恢复CGI64 v3.2,支持GHO/WIM/SWM,支持GPT/动态磁盘(2014.02.09) 单文件版 内置的IMAGEX版本为6.3.9600.17029 注:此版本的IMAGEX无法在NT5平台中运行,其实从WIN8.1正式版就这样了,这是微软要搞死XP...

    原生JS无限级树形菜单(兼容各浏览器)

    原生JS写的无限级树形菜单(包含文件:otree.js,otree.css,demo.html,demo1.html,imgs/ ),兼容IE6/7/8/9+、Chrome、Firefox、Opera、Safari等主流浏览器,以及360/搜狗等其他各浏览器。 可动态添加/删除节点,启用/...

    xml struts

    在这个例子中,当用户访问"/example"路径时,Struts将调用`com.example.ExampleAction`类来处理请求,如果处理成功,它会将控制权转发到`/jsp/success.jsp`页面。 2. **数据源配置**:Struts框架允许我们在XML配置...

    JS多级联动下拉列表(自定义级数)

    在网页开发中,多级联动下拉列表是一种常见的交互元素,尤其在处理地理位置选择或层级分类时非常实用。本文将详细介绍如何使用原生JavaScript实现一个可自定义级数的多级联动下拉列表,以及如何根据提供的"demo"文件...

    基于深度学习的胸部常见病变诊断方法.pdf

    英文引用:ZHANG Chiming,WANG Qingfeng,LIU Zhiqin,et al. Diagnostic method of frequently occurring chest diseases based on deep leaning[J]. Computer Engineering,2020,46(7):306-311,320. 这种深度...

    qingfeng-cloud-master.zip

    青锋Cloud+VUE前后端分离后台管理系统,后端采用:SpringCloud+Alibaba+Nacas+OAuth2Jwt+Gateway+skywalking+Feign+Spring Boot Admin等技术;前端采用VUE+ant design。整合了菜单功能权限、数据权限、代码生成器、...

    IT Tools工具箱开发人员在线工具集合系统源码

    首先,执行以下命令来安装项目依赖:pnpm install接着,进行编译和热重载以进行开发:pnpm dev要进行生产环境的类型检查、编译和压缩,请执行以下命令:pnpm build单元测试可以通过Vitest来运行,命令如下:pnpm ...

    JS仿C#的String.Format函数

    在JavaScript中,没有内置的`String.Format`函数,如C#中那样,它提供了一种方便的方式来格式化字符串。然而,由于JavaScript的灵活性,我们可以创建一个类似的函数来实现这一功能。`String.Format`的主要作用是将...

    qingfeng_3.2.2_zouqi02_release_322_jiagu_sign_sign_1228 (1).apk

    qingfeng_3.2.2_zouqi02_release_322_jiagu_sign_sign_1228 (1).apk

Global site tag (gtag.js) - Google Analytics