1、会话概述

(1)会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。

(2)会话过程中的数据不宜保存在request和servletContex中,所以一般中cookie保存

(3)保存会话数据的两种技术

==> Cookie:Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器

==> HttpSession:Session是服务器端技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的HttpSession对象

2、Cookie API

javax.servlet.http.Cookie类用于创建一个Cookie,response接口中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。

Cookie类的方法:

==> new Cookie(String name,String value) 新建一个cookie

==> cookie.getName() 获取此Cookie对象的name

==> cookie.getValue()与cookie.setValue() 获取和设置此Cookie对象的value

==> cookie.setMaxAge()与cookie.getMaxAge() 设置此cookie的有效时间(单位是秒)

==> cookie.setPath()与cookie.getPath()

==> cookie.setDomain()与cookie.getDomain()

3、Cookie的属性

(1)name:必须的

(2)value:必须的

(3)comment:可选的。注释

(4)path:可选的

写Cookie的程序的访问路径是:http://localhost:8080/testServlet/cookie/cookieDemo(其中:localhost就是域名;/testServlet/cookie就是当前Cookie的path)。访问的地址的URI.startWith(cookie的路径)为true,客户端的数据会传给服务器

==》比如浏览器存的cookie的路径是/testServlet

现在访问的地址是:http://localhost:8080/testServlet/cookie/cookieDemo 客户端的数据会传给服务器

现在访问的地址是:http://localhost:8080/testServlet/cookieDemo 会

如果一个Cookie的路径设置成了/testServlet,意味着当前应用下的所有资源浏览器都会传给给服务器

==》比如浏览器存的cookie的路径是/testServlet/cookie

现在访问的地址是:http://localhost:8080/testServlet/cookie/cookieDemo 会

现在访问的地址是:http://localhost:8080/testServlet/cookieDemo 不会

(5)domain:可选的。该Cookie所属的网站域名(localhost)默认值。

(6)maximum age:可选的。单位是秒。不设置就是会话过程(存在浏览器的内存中)。如果是0,说明要删除。

(7)version:可选的

(8)区分Cookie:domain + path + name 来区分的

4、Cookie的增加、读取、删除

(1)增加:HttpServletResponse.addCookie(name,value)

一个浏览器针对一个网站最多存20个Cookie;最多存300个Cookie,每个Cookie的长度不能超过4KB

一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie

(2)读取:HttpServletRequest.getCookies() 只能从客户端得到key和value的值

(3)删除:cookie.setMaxAge(0);

如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。

删除cookie时,path必须一致,否则不会删除

(4)示例

		==>增加cookie
PrintWriter out = resp.getWriter();
out.println("写入Cookie测试"); Cookie cookie = new Cookie("username", "smalle"); //创建一个Cookie实例
cookie.setMaxAge(60); //单位是秒,设置有效时间为1分钟。最大可以设置Integer.MAX_VALUE
resp.addCookie(cookie); // 往响应流中写入Cookie out.println("如果不清除cookie,即使关闭了浏览器,只要在60内访问任可以访问到");
---------------------------------------------------------------------------------
==>读取cookie
PrintWriter out = resp.getWriter();
out.println("读取Cookie测试"); Cookie[] cookies = req.getCookies(); //获取请求Cookie数组
if(cookies != null) {
for(Cookie cookie : cookies) { //遍历cookie信息
out.println("Cookie名: " + cookie.getName());
out.println("Cookie值: " + cookie.getValue());
out.println("从客户端只能获取key和value,利用getMaxAge()等方法是获取不到相应的信息的");
}
}else {
out.println("您还没有Cookie值");
}
----------------------------------------------------------------------------------
==>清除cookie
Cookie cookie = new Cookie("username", null);
cookie.setMaxAge(0);
//cookie.setPath("/");
resp.addCookie(cookie);
/**
* 如果需要注销所有的cookie
* Cookie[] cookies = request.getCookies();
* for (Cookie cookie : cookies) {
* cookie2.setMaxAge(0);
* //cookie.setPath("/");
* response.addCookie(cookie);
* }
*/

5、Session介绍

(1)在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象)。注意:默认情况下,一个浏览器独占一个session对象。服务器就把数据保存在这个session对象中,当退出浏览器时,保存的数据就会丢失。

(2)Session和Cookie的主要区别在于:

==》Cookie是把用户的数据写给用户的浏览器。

==》Session技术把用户的数据写到用户独占的session中。Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。

(3)Session就相当于特殊的Cookie,Cookie中的JSESSIONID就是此session的ID。可用session.getId()验证

6、创建HttpSession

(1)public HttpSession getSession()。调用此方法时,容器会先检查客户端先前发送出的请求是否创建过Http会话。如果没有,容器就会新建一个会话,并赋予一个唯一的会话ID。如果有,容器会根据客户请求中的会话ID找到匹配的会话返回。

(2)public HttpSession getSession(boolean flag)。此方法的flag参数是用来置顶是否有必须要创建一个新的会话。调用getSession(false)时,若客户先前没有建立过会话。则方法将返回null。如果flag为true则同第一种

(3)HttpSession的常用操作:

==> public boolean isNew():判断当前会话对象是不是一个新创建的会话。

==> public Object getAttribute(String name); 根据置顶名从会话中取出某个属性对应的值。

==> public void setAttribute(String key,Object value); 设置指定名称将某个对象存放在会话中。

==> public void removeAttribute(String key); 根据key删除会中中的对象。

==> public long getCreationTime():返回session创建的时间的毫秒值。

==> public String getId(); 获取会话的SessionId;

==> public long getLastAccessdTime(); 得到最好一次访问次会话的时间毫秒值。

==> public long getMaxInactiveInterval(); 得到会话超时的时间秒值。

==> public void setMaxInactiveInterval(int interval); 设置会话超时的时间秒值。

==> public void invalidate(); 让所有会话失效。

(4)示例

		==>设置session
//访问的话,直接在浏览器中输入 http://127.0.0.1:8080/testServlet/setSession?name=smalle
String name = req.getParameter("name");
HttpSession session = req.getSession(); //获取HttpSession对象
session.setAttribute("name", name); //写入session,实际上时写在内存中了,在cookie保存相应的ID
/** 跳转到getSession查看保存的值。
* 此处的href必须为/testServlet/getSession或者为getSession才hi跳转到http://127.0.0.1:8080/testServlet/getSession
* 带/表示绝对路径,不带/表示相对路径(相对于根目录 http://127.0.0.1:8080/项目名)
*/
resp.getWriter().write("<a href='getSession'>click view</a>");
-------------------------------------------------------------------------------------
==>得到session
HttpSession session = req.getSession(); //获取HttpSession对象
String name = (String)session.getAttribute("name");
resp.getWriter().write("保存的值为===" + name);
//这两个\n都能显示换行
resp.getWriter().write('\n'+ "\nID为===" + session.getId() + "===他就是Cookie下的JSESSIONID的值"); //这句是验证5、Session介绍中的第(3)条
----------------------------------------------
==>web.xml中的代码省略

7、更改内存中HttpSession对象的超时时间(注意单位是分钟)

修改工程的web.xml

		<session-config>
<session-timeout>30</session-timeout> <!--自然整数,单位是分钟,即保存30分钟-->
</session-config>

最新文章

  1. 基于dubbo构建分布式项目与服务模块
  2. SQL入门语句之ORDER BY 和GROUP BY
  3. Linux定时任务Crontab详解
  4. ZOJ 3781 Paint the Grid Reloaded(BFS)
  5. python多态
  6. Android系统版本与API Level对照表
  7. ASP.NET MVC概述
  8. JavaScript高级程序设计15.pdf
  9. CSS中文字体的英文名称(simsun)宋体,(Microsoft YaHei)微软雅黑
  10. 深入剖析java迭代器以及C#迭代器!
  11. 我的csdn博客搬家了
  12. Python之面向对象三
  13. waitGroup的使用
  14. DFT scan chain
  15. SNMP学习笔记之SNMPv3报文认证和加密
  16. Clipboard.GetImage() Clipboard获取粘贴板内容为null的解决办法
  17. html端编码规范
  18. C# 控制台应用程序输出颜色字体
  19. LeetCode OJ——Climbing Stairs
  20. 存储过程系列二:适用函数wm_concat(column)函数实现字段合并

热门文章

  1. android问题笔记集
  2. linux备忘录-账号管理与ACL权限设定
  3. BZOJ 4184 shallot 线性基+分治
  4. Win7/8, convert dynamic disk volume to basic volume.
  5. regex &amp; form validation &amp; phone
  6. QueryHelper插件类(hql)
  7. 周记【距gdoi:126天】
  8. fzu 2246(ac 自动机)
  9. Android-使用ViewFlipper实现轮番切换广告栏
  10. 防恶意解析,禁止用IP访问网站的Apache设置