上一篇: 会话技术Cookie和Session详解.
本文目录
- 1.Cookie共享问题
- 1.1 同一个Tomcat服务器
- 1.1.1 验证
- 1.2 不同的Tomcat服务器
1.Cookie共享问题
1.1 同一个Tomcat服务器
- 正常的
cookie
只能在一个应用中(简单理解,就是一个目录)共享,即一个cookie
只能由创建它的应用获得。默认情况下cookie不能被多个Web应用共享, - 比如我的Tomcat/webapp下面有两个应用:Test1和Test2,在Test1中创建自己应用的
cookie
,没有设置Path属性的情况下,那么在Test2下是肯定拿不到的。很容易忽视的一点:Cookie path
默认是产生cookie的应用
的路径。 - 如果Test2需要共享Test1中的
cookie
:就要用到Cookie类的setPath(String uri);
该方法的参数,是相对于应用服务器存放应用的文件夹的根目录而言的(比如Tomcat下面的webapp)。 - Test1设置
cookie
时,增加一条cookie.setPath("/");
可以在webapp文件夹下的所有应用共享cookie
或者cookie.setPath("/Test2");
指Test1应用设置的cookie
只能在Test2应用下的获得,即便是产生这个cookie
的Test1应用也不可以。 - 如果设置了
cookie.setPath("/Test2/myinfo");
只有在Test2/myinfo下面可以获得该cookie
,在Test2下面但是在myinfo文件夹外的都不能获得cookie。非常严格。 - 那设置多条
cookie.setPath("XXX");
语句呢? 答案是最后一条语句才会起作用,符合了我们的经验。
1.1.1 验证
这个例子是用户第一次访问Tes1应用时,创建2个Cookie对象,cookie是用户第一次访问的时间,cookie1是上一次访问时间;用户再访问Tes1应用,读取两个cookie,页面显示出用户第一次访问的时间和上一次访问时间;
Test1代码:
package Test;
import ...
rvlet(name = "Test.Test1", urlPatterns = "/Test.Test1")
public class Test1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//指定服务器的编码方式UTF-8,防止发生乱码
response.setContentType("text/html;charset=utf-8");
//用户第一次访问服务器的时间
String firstAccessTime=null;
//用户上一次访问服务器的时间
String lastAccessTime = null;
// 获取所有的cookie,并将这些cookie存放在数组中
Cookie[] cookies = request.getCookies();
// 遍历cookies数组
for (int i = 0; cookies != null && i < cookies.length; i++) {
if ("firstAccess".equals(cookies[i].getName())) {
// 如果cookie的名称为firstAccess,则获取该cookie的值
firstAccessTime = cookies[i].getValue();
}
if ("lastAccess".equals(cookies[i].getName())) {
// 如果cookie的名称为lastAccess,则获取该cookie的值
lastAccessTime = cookies[i].getValue();
break;
}
}
//判断是否存在名称为lastAccess的cookie
if (lastAccessTime == null) {
response.getWriter().print("您是首次访问本站!!!");
String nowTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss")
.format(new Date());
Cookie cookie1 = new Cookie("firstAccess", nowTime);
response.addCookie(cookie1);
} else {
response.getWriter().println("您上次的访问时间是: "
+ lastAccessTime+"<br>");
response.getWriter().println("您第一次访问时间是: "
+ firstAccessTime+"<br>");
}
// 创建cookie,将当前时间作为cookie的值发送给客户端
String currentTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss").format(new Date());
Cookie cookie = new Cookie("lastAccess", currentTime);
//设置cookie最大存在时间
cookie.setMaxAge(60*60); //以秒为单位,此处为3600秒
// 发送 cookie
response.addCookie(cookie);
}
}
访问Test1:
再次访问:
查看Cookie:
修改上述代码:添加一条语句cookie1.setPath("/Test2");
if (lastAccessTime == null) {
response.getWriter().print("您是首次访问本站!!!");
String nowTime = new SimpleDateFormat("yyyy-MM-dd-hh:mm:ss")
.format(new Date());
Cookie cookie1 = new Cookie("firstAccess", nowTime);
cookie1.setPath("/Test2");
response.addCookie(cookie1);
} else {
response.getWriter().println("您上次的访问时间是: "
+ lastAccessTime+"<br>");
response.getWriter().println("您第一次访问时间是: "
+ firstAccessTime+"<br>");
}
Test2的代码:
package Test;
import ...
rvlet(name = "Test2",urlPatterns = "/Test2")
public class Test2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//指定服务器的编码方式UTF-8,防止发生乱码
response.setContentType("text/html;charset=utf-8");
//用户第一次访问服务器的时间
String firstAccessTime=null;
// 获取所有的cookie,并将这些cookie存放在数组中
Cookie[] cookies = request.getCookies();
// 遍历cookies数组
for (int i = 0; cookies != null && i < cookies.length; i++) {
if ("firstAccess".equals(cookies[i].getName())) {
// 如果cookie的名称为firstAccess,则获取该cookie的值
firstAccessTime = cookies[i].getValue();
break;
}else
firstAccessTime="没有找到访问时间";
}
response.getWriter().println("您第一次访问时间是: " + firstAccessTime+"<br>");
}
}
修改Test1代码:cookie1.setPath("/");
访问Test1
查看Cookie
访问Test2
1.2 不同的Tomcat服务器
Domain表示的是cookie所在的域,默认为请求的地址,如网址为www.cjdx.net/test/test.aspx,那么Domain默认为www.cjdx.net。
- 跨域共享cookie的方法:用到
setDomain(String path);
方法,该参数是的域名,如果一级域名相同,那么多个服务器之间cookie可以共享。 - 如果服务器A所在的域是:t1.test.com,A有一个Web应用Test1;
服务器B所在的域是:t2.test.com,B有一个应用Test2。 - 那么在Test1中设置cookie时,使用语句
cookie.setDomain(".test.com");
,这样在Test2中就可以取到这个cookie,还可以在默认的t1.test.com下共享。注意这个参数必须以"."开始。
欢迎点赞评论,指出不足,笔者由衷感谢哦!~