第四章:Web会话
第1节:会话跟踪概述
知识点1:会话的概念与作用
1.什么是会话
浏览器和服务器之间的一次连续的通讯过程叫做会话.
2.会话的作用
会话跟踪技术就能够实现这样的功能:
1.能够跟踪客户端与服务器端的交互,
2.保存和记忆相关的信息,
3.保存请求的状态信息。
4.解决HTTP协议的无状态的弊端
知识点2:现行常用的会话跟踪技术
1.URL方式:需要保存的信息直接追加到URL后,例如:http://127.0.0.1:8080/chapter03/viewList?pageNo=12
2.隐藏域方式:可以使用表单中的隐藏域保存相关信息, 例如:
<input type=“hidden” name=“status" value=“true">
3.Cookie方式:将状态信息保存到客户端,服务器能够获得相关信息进行分析,从而生成对客户端的响应;例如简化登录功能就可以使用Cookie实现;
4.Session方式:将状态信息保存到服务器的会话对象中,通过唯一标记的ID值与客户端进行绑定使用;例如访问控制功能就可以使用Session实现.
第2节:Cookie
知识点1: Cookie的功能与特点
1.什么是Cookie
Cookie是保存在客户端的小文本
2.Cookie的功能
将用户活动过程中 的状态信息保存在客户端
3.Cookie的特点
1.Cookie在客户端保存用户的信息
2.服务器可以得到用户的信息进行处理,跟踪用户的状态
知识点2: Cookie的域及最大生命时间
1.name:cookie的名字,每个cookie都有一个名字;
2.content:cookie的值,与名字一起作为键值对形式存在;
3.domain:域,该cookie的域名,例如左图中是163.com,说明当前cookie来自163.com;
4.path:路径,访问163.com下该路径时,当前cookie将被发送;
5.Created:cookie被创建的时间;
6.Expired:cookie失效的时间;
7.最大生命时间:失效时间和创建时间的时间差,就是cookie的最大生命时间,超过该时间,cookie将失效,不再被发送到相应的域地址;
知识点3:在Servlet中创建Cookie、设置Cookie属性
知识点4:在响应中设置Cookie信息
如何将创建好的cookie对象保存到客户端?
response.addCookie(cookie);
作用:
1.将Servlet创建好的Cookie对象放到response对象中
2.在没有设置最大生命时间的情况下.浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存中,关闭浏览器缓存就没有了,cookie也没有了.
3.如果设置了最大生命时间(如:7243600)的情况下,浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存和硬盘中,关闭浏览器缓存就没有了,cookie还存在,下次开启浏览器访问网站时cookie还能使用.
执行流程:
1.第一次请求:服务器将cookie放到response对象中,让浏览器保存cookie对象
2.第二次请求:浏览器会自动带Cookie对象一并发送到服务器
知识点5:获取请求中的Cookie信息
当访问相同域及路径时,没有超过有效时间的cookie将自动通过请求被发送到服务器端
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 创建Cookie
Cookie cookie = new Cookie("username", "zhangsan");
//将cookie保存到客户端
response.addCookie(cookie);
//得到浏览器发送过来的cookie
Cookie[] cookies = request.getCookies();
//遍历数组
if(cookie!=null){
for (Cookie cookie2 : cookies) {
System.out.println(cookie2.getName()+":"+cookie2.getValue());
}
}
response.getWriter().append("Served at: ").append(request.getContextPath());
}
知识点6:Cookie的最大生命时间
1.在没有设置最大生命时间的情况下
浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存中,关闭浏览器缓存就没有了,cookie也没有了.
关闭浏览器,关闭服务器重启
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到浏览器发送过来的cookie
Cookie[] cookies = request.getCookies();
//遍历数组
if (cookies==null) {
// 创建Cookie
Cookie cookie = new Cookie("username", "zhangsan");
//将cookie保存到客户端
response.addCookie(cookie);
}else {
for (Cookie cookie2 : cookies) {
System.out.println(cookie2.getName()+":"+cookie2.getValue());
}
}
response.getWriter().append("Served at: ").append(request.getContextPath());
}
2.如果设置了最大生命时间的情况下
浏览器接收到Cookie对象后存储到浏览器的本地cookie缓存和硬盘中,关闭浏览器缓存就没有了,cookie还存在,下次开启浏览器访问网站时cookie还能使用.
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//得到浏览器发送过来的cookie
Cookie[] cookies = request.getCookies();
//遍历数组
if (cookies==null) {
// 创建Cookie
Cookie cookie = new Cookie("username", "zhangsan");
cookie.setMaxAge(7*24*3600);//设置cookie的最大生命时间为7天
//将cookie保存到客户端
response.addCookie(cookie);
}else {
for (Cookie cookie2 : cookies) {
System.out.println(cookie2.getName()+":"+cookie2.getValue());
}
}
response.getWriter().append("Served at: ").append(request.getContextPath());
}
第3节:Session
知识点1:Session简介
1.什么是session
Session是存储在服务器上的对象,该对象由服务器创建并维护,是会话跟踪的另一种实现手段
2.Session的特点
1.服务器为客户端与服务器的每一次会话过程都创建并维护一个Session对象;
2.每个服务器对Session的创建和维护的底层实现有所区别
3.Tomcat如何维护session对象的id
Tomcat使用Cookie来维护Session对象的ID值;该Cookie名字为JSESSIONID ;
4.客户端开始一次会话过程的步骤(会话跟踪的原理)
知识点2:Session使用方法
1.session能保存任何对象
2.session保存的是状态信息,如:登录信息(用户信息),其他的状态信息.
3.session可以跨页面,跨请求访问,session可以使用重定向的方式带数据
4.不能无限制的存储,随着越来越多用户登录,Session 所需要的服务器内存量也会不断增加
5.每个 Session 对象的持续时间是用户访问的时间加上不活动的时间
6.实现自定义session的基本步骤
1.Session的实现仍然依靠临时态的Cookie,因此需要定义一个属于自定义session体系的Cookie名称(如JavaEE应用服务器中常用的JSESSIONID)
2.在服务端创建一个Map,用于存放所有的用户会话
3.当用户访问系统时,检查请求中是否存在以自定义session体系Cookie名称命名的Cookie信息
3.1如果没有,说明是一个新用户,则为该用户生成一个唯一的sessionId字符串,并在响应中添加该Cookie值(注意不要提供Cookie的生效时间,那么该Cookie即为瞬态的,只在浏览器当前进程中生效)
3.2如果有则查看Map中是否存在该会话,有即获取会话信息,没有说明该会话已经超时,为用户构建一个新的会话
4.一个用户的会话对象实质上也是一个Map,可以通过键值对的形式存放、获取会话变量
知识点3:HttpSession对象的获取
1.request接口提供的方法
2.用法
request.getSession()
获取与当前请求相关的session对象,如果session对象不存在,创建一个新的session对象
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//在servlet中调用request.getSession()的方法得到session对象
HttpSession session = request.getSession();
//id
String id = session.getId();
//out
response.getWriter().append("Served at: ").append(id);
}
知识点4:剖析session的执行过程
1.第一次访问Servlet请求
客户端浏览器的cookie缓存中并没有存储sessionid的cookie,不会发送JSESSIONID的cookie
2.第一次访问Servlet响应
向浏览器发送JSESSIONID的cookie,让浏览器保存该cookie
3.第二次及以后访问servlet请求
第二次及以后请求浏览器就会服务器发送JSESSIONID的cookie
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//在servlet中调用request.getSession()的方法得到session对象
HttpSession session = request.getSession();
//id
String id = session.getId();
//得到cookie
Cookie[] cookies = request.getCookies();
if (cookies!=null) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if (name.equals("JSESSIONID")) {
System.out.println("JSESSIONID="+cookie.getValue());
}
}
}
//out
response.getWriter().append("Served at: ").append(id);
}
知识点5:Session常用方法
1.添加属性
session.setAttribute(name,value);
2.获得属性
session.getAttribute(name);
3.删除属性
session.removeAttribute(name);
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到session
HttpSession session = request.getSession();
//向session对象添加属性值
session.setAttribute("username", "zhangsan");
//响应重定向到jsp
response.sendRedirect(request.getContextPath()+"/welcome.jsp");
}
<body>
<%=request.getSession().getAttribute("username")%>
</body>
4.session失效的方法
(1)为什么要让Session失效
1.会话对象是存储在服务器端的对象,一直存在需要占用一定的服务器资源;
2.会话中往往保存着用户的一些数据,如果一直有效,存在一定安全隐患。
(2)Session失效的方法
1.服务器都有默认的会话失效时间,Tomcat默认是30分钟;
2.可以在web.xml中配置失效时间,例如:配置失效时间是50分钟;
<session-config>
<session-timeout>50</session-timeout>
</session-config>
3.调用HttpSession接口中的两个方法,可以对指定的会话对象进行销毁
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 得到session
HttpSession session = request.getSession();
//向session对象添加属性值
session.setAttribute("username", "zhangsan");
session.invalidate();
//响应重定向到jsp
response.sendRedirect(request.getContextPath()+"/welcome.jsp");
}