您的位置:首页 > 编程语言 > Java开发

[Java]Session,Cookie知识与应用

2016-06-11 16:13 555 查看
1.会话的概念(打开一个浏览器访问各页面直至关闭此浏览器的过程)-------------->用于保存用户数据

什么是会话?
•会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。
会话过程中要解决的一些问题?
•每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
•例如:用户点击超链接通过一个servlet购买了一个商品,程序应该想办法保存用户购买的商品,以便于用户点结帐servlet时,结帐servlet可以得到用户购买的商品为用户结帐。
•思考:用户购买的商品保存在request或servletContext中行不行?

数据存在request里面转过去,那么用户体验会很差,因为买一件商品就要跳到结账页面。而ServletContext是个全局性的容器,会被所有用户共享。

Cookie
•Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

用户购买商品过程:



Cookie使用:创建Cookie对象(名称-->值),通过response的addCookie方法带给浏览器.用户下次带Cookie过来,通过request获取Cookie,这里getCookies获取所有的Cookie.

setMaxAge使用:如果不设置,Cookie默认有效期是浏览器进程,一次会话关闭浏览器,Cookie即消失。如果设置,则把Cookie写入本地硬盘。

setPath:有效目录,默认是设置该Cookie的Servlet所在目录。

setDomain:设置域------->实际无效,其他网站不会接受你的第三方Cookie(浏览器默认也会阻止该Cookie)

应用:显示用户上次访问时间--->每次访问根据Cookie获取上次访问时间,每次又都要把本次访问时间通过Cookie回写给浏览器



代码:
package cn.itcast.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Date;

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

public class SessionCookieServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");

PrintWriter out=response.getWriter();
out.print("您上次访问时间是:");

//获得用户的时间Cookie
//得到的是一个Cookie数组
Cookie cookies[]=request.getCookies();
//一定要严谨!用户第一次没有带Cookie过来!
for(int i=0;cookies!=null && i<cookies.length;i++){//不为空判断写在前面,短路判断,如果为空不判断第二个条件,保证安全!
//找到这个名字的Cookie
if(cookies[i].getName().equals("lastAccessTime")){
long cookieValue=Long.parseLong(cookies[i].getValue());//转成毫秒值,为long类型
Date date=new Date(cookieValue);
out.print(date.toLocaleString());
}
}

//给用户回送最新访问时间
//创建Cookie对象
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");//注意System.currentTimeMillis()是long值,转字符串加""
//设置有效期
cookie.setMaxAge(1*30*24*3600);
cookie.setPath("/practice_servlet");//该应用下所有的资源
response.addCookie(cookie);
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doGet(request, response);
}

}


Cookie细节:

一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
注意,删除cookie时,path必须一致,否则不会删除

清除Cookie:只要回写一个同名Cookie,最大时效设为0,则浏览器收到后会自动删除该Cookie.

代码:

SessionCookieServlet中添加:
out.print("<a href='/practice_servlet/servlet/ClearCookie'>清除访问时间</a><br/>");


ClearCookie页面:
package cn.itcast.servlet;

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;

public class ClearCookie extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMillis()+"");
cookie.setMaxAge(0);
//注意有效路径也要设置一致!
cookie.setPath("/practice_servlet");
response.addCookie(cookie);
//!!注意:sendRedirect是response的方法!!以响应的方式通知浏览器重定向!!浏览器访问
//需要加上应用的路径!!
//这里重定向访问SessionCookieServlet页面后则又创建了一个Cookie,见上方SessionCookieServlet代码
response.sendRedirect("/practice_servlet/servlet/SessionCookieServlet");
}

public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

doGet(request, response);
}

}


Session
•Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session和Cookie的主要区别在于:
•Cookie是把用户的数据写给用户的浏览器。
•Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

用户数据传递过程:(第一次访问服务器会为用户创建一个Session,同一次会话再次访问就会使用同一个Session保存用户数据)



Session创建时间:并不是浏览器一访问服务器某个资源就创建Session,是第-一-次-访-问request.getSession代码时才创建!!

Session摧毁:由服务器管理,Session对象30分钟没人用了才会摧毁

Session属于Web资源,可以在web.xml中配置失效时间,单位是分钟

代码中可以用request.getSession().invalidate()摧毁

request.getSession(false):不创建只获取Session,查看购物车时会用到

Session工作原理:基于Cookie,通过Cookie为每个用户回送唯一一个session id.用户下次访问时会带着session id过来-------->这时回送id的Cookie是没有设置有效期的,有效期默认是浏览器进程,会话结束Cookie即失效,下一次打开浏览器访问,服务器会创建新的session id.那么如果要应用于购物车,需要设置这个Cookie的有效期,这个Cookie的名字叫做JSESSIONID.我们需要在代码里复写这个Cookie代替服务器回写的Cookie,因为Session是通过Cookie实现的,下一次访问时服务器会根据这个名字为JSESSIONID的Cookie找到上次为用户创建的Session为用户服务(但这个Session对象在服务器中默认30分钟存活!!所以这个Cookie有效期也设置30分钟就行了!!)



示例:

首页:

<a href="/practice_servlet/servlet/BuyServlet">购买</a><a href="/practice_servlet/servlet/PayServlet">结账</a> <br>
<a href="/practice_servlet/servlet/ResponseDemo">查看图书</a>


购买Servlet:

request.getSession().setAttribute("book", "您购买了电视机");


结账Servlet:

response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//同一次会话
String value=(String) request.getSession().getAttribute("book");
PrintWriter writer=response.getWriter();
writer.write(value);





回写名为JSESSIONID的Cookie覆盖服务器回写的Cookie,下一次访问服务器根据这个Cookie设置的id和有效期找到上一次的Session(默认最多30分钟有效):



禁用Cookie的情况下(这时用ip地址访问来看效果!)使用Session:(浏览器不接受Cookie,也不会带Cookie给服务器,同一次会话中,这一次用Session保存数据,下一次访问创建新的Session,丢失上次数据)

解决方式:URL重写的方式将url后面带上session id.

getSession首先判断session id是否以Cookie带过来,再判断是否以url带过来,如果都没带过来则创建Session.

示例:Servlet模拟首页,访问首页时即创建Session,重写每个可能的超链接,附上session id,点击购买向同一个Session中存入数据(因为是同一次会话,首页已经创建Session,购买页面getSession()不会重新创建,根据url重写传过来的id找到同一个Session),点击结账时,因为是同一个session id,getSession()会根据这个url重写传过来的id找到同一个Session,获取到数据!





细节:如果此时Cookie解禁,第一次访问时服务器不知Cookie是否禁用,会重写url带上session id,并以Cookie回写session id给浏览器,第二次访问因为用户带Cookie过来,那么不会再重写url(getSession()方法内部机制判断)

如果禁用Cookie用url重写的方式实现Session,那么关了浏览器再开,Session数据不再的问题无法再解决,因为这一次重写一个新的session id,无法找到上次数据!!

重开选项卡,或基于同一窗口打开的超链接窗口,都共享同一Session,但不同浏览器有差别!!IE8:多个独立开启的浏览器窗口共享同一个Session
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: