[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回写给浏览器
代码:
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中添加:
ClearCookie页面:
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分钟就行了!!)
示例:
首页:
购买Servlet:
结账Servlet:
回写名为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
什么是会话?
•会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个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
相关文章推荐
- JavaWeb学习笔记之Servlet九大内置对象
- 三大框架-------->struts2 OGNL表达式
- leetcode-java-198. House Robber
- JavaWeb学习笔记之Mybatis关键对象
- Spring源码阅读之Resource接口
- Spring中出现The prefix “xxxx” for element “xxxxxx”is not bound.即一些标签不提示而且你又找不到dtd约束文件
- Ubuntu 15.04 下apt-get安装JDK
- Spring提供的单元测试
- leetcode 113. Path Sum II-路径和|回溯算法
- (转)java 从jar包中读取资源文件
- java的常见异常与错误总结
- Hibernate4关系映射总结
- 深入理解Java国际化
- Java---俄罗斯方块小游戏
- Java---俄罗斯方块小游戏
- 国际化: 理解Java平台上的Locale
- 增强型for循环
- java 时间戳
- 梳理spring-aop的利器:asm3.0
- Java学习笔记之RMI远程方法调用