引入:
Cookie的局限:
1)Cookie只能存字符串类型,不能保存对象
2)只能存非中文
3)1个Cookie的容量不超过4KB
如果要保存非字符串,超过4kb内容,只能使用session技术
Session概念: Session是另一种记录客户状态的机制,不同的是Cookie保存在客户端浏览器中,而Session保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上。这就是Session。客户端浏览器再次访问时只需要从该Session中查找该客户的状态就可以了。
如果说Cookie机制是通过检查客户身上的“通行证”来确定客户身份的话,那么Session机制就是通过检查服务器上的“客户明细表”来确认客户身份。Session相当于程序在服务器上建立的一份客户档案,客户来访的时候只需要查询客户档案表就可以了。
Session的特点:会话数据保存在服务器端(内存中)
Session技术核心:HttpSession类,用于保存会话技术
1)创建或得到session对象
HttpSession.getSession( )
HttpSession.getSession(boolean create)
2)设置session对象
void setMaxInactivelnterval(int interval); 设置session的有效时间
void invalidate(); 销毁session对象
java.lang.String getId() 得到session编号
3)保存会话数据到session对象
void setAttribute(java.lang.String name, java.lang.Object value); 保存数据
java.lang.Object getAttribute(java.lang.String name); 获取数据
void removeAttribute(java.lang.String name); 清除数据
Session机制: 除了使用Cookie,Web应用程序中还经常使用Session来记录客户端状态。Session是服务器端使用的一种记录客户端状态的机制,使用上比Cookie简单一些,相应的也增加了服务器的存储压力。
Session技术则是服务端的解决方案,它是通过服务器来保持状态的。由于Session这个词汇包含的语义很多,因此需要在这里明确一下 Session的含义。首先,我们通常都会把Session翻译成会话,因此我们可以把客户端浏览器与服务器之间一系列交互的动作称为一个 Session。从这个语义出发,我们会提到Session持续的时间,会提到在Session过程中进行了什么操作等等;其次,Session指的是服务器端为客户端所开辟的存储空间,在其中保存的信息就是用于保持状态。从这个语义出发,我们则会提到往Session中存放什么内容,如何根据键值从 Session中获取匹配的内容等。要使用Session,第一步当然是创建Session了。那么Session在何时创建呢?当然还是在服务器端程序运行的过程中创建的,不同语言实现的应用程序有不同创建Session的方法,而在Java中是通过调用HttpServletRequest的getSession方法(使用true作为参数)创建的。在创建了Session的同时,服务器会为该Session生成唯一的Session id,而这个Session id在随后的请求中会被用来重新获得已经创建的Session;在Session被创建之后,就可以调用Session相关的方法往Session中增加内容了,而这些内容只会保存在服务器中,发到客户端的只有Session id;当客户端再次发送请求的时候,会将这个Session id带上,服务器接受到请求之后就会依据Session id找到相应的Session,从而再次使用之。正式这样一个过程,用户的状态也就得以保持了。
代码示例:
package com.session.demo;
/**
* @Description Session底层原理:服务端创建了一个Session之后, 会在响应里面将SessionId返回给客户端
* 客户端将SessionId保存在本地磁盘, 再次请求的时候, 将SessionId通过
* 请求头的方式传给服务器端.
* 服务器创建完session,会将SessionId通过请求头的方式返回给客户端
* 客户端将保存在本地sessionId(请求头)服务器端, 服务器就会去通过sessionId去查找
* Session的值是存放在服务器端的内存中
* session是存放在服务端上的, 只要没达到失效时间, 是会一直存在的,
* 当关闭浏览器时, 只是sessionId失效, 但session并没有失效, 当再次打开浏览器时, 又会创建一个新的sessionId
* @author ShengLiu
* @date 2018/7/8
*/
public class Session {
public Session() {
}
}
package com.session.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Description 创建Session
* @author ShengLiu
* @date 2018/7/8
*/
@WebServlet("/createSession")
public class CreateSession extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 默认是true, 表示没有Session, 就会创建一个Session. 如果为false, 表示如果没有找到Session, 就不会创建一个Session
HttpSession session = req.getSession();
session.setAttribute("username", "shengliu");
System.out.println("保存session成功..." + session.getId());
}
}package com.session.demo;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* @Description 获取Session的值
* @author ShengLiu
* @date 2018/7/8
*/
@WebServlet("getSessionServlet")
public class GetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(false);
if (session != null){
String username = (String) session.getAttribute("username");
System.out.println("GetSessionServlet..." + username);
System.out.println("sessionId: " + session.getId());
}else {
System.out.println("没有找到任何结果...");
}
}
}