1.1 Session 简介
- WEB服务器可以为每一个来访的用户浏览器创建一个会话对象(session对象),
- 如果需要保存用户的数据,我们的程序可以把用户的数据保存在用户浏览器独享的session对象中,
- 如果用户再次的使用浏览器来访问其他的WEB资源,其他的WEB资源也可以通过session对象来获取这个用户的数据,以便为这个用户再次的服务
- session对象由WEB服务器创建,我们可以通过请求对象的方法getSession()来获取。
1.1.1 cookie和session的区别
- cookie
是一种客户端技术,有大小和数量的限制,把数据保存在客户端,所以相对的不安全 - session
是一种服务器端技术,没有大小和数量的限制,把数据保存在服务器端,所以相对的安全 - 一些思路
- 如何区分一个session是哪个用户的,这个才是最难
- 银行 开保险柜 给你钥匙
- 关键点: 这个钥匙,怎么给到客户 如何让客户每次来的时候都带上钥匙 用的cookie
- 所以某种意义上 session依赖于cookie id id存在cookie
1.1.2 实现原理
session实现的原理.png-
基于cookie
-
第一次调用 getSession方法 发现客户端没有session对象,就会创建一个新的session对象
-
并且把session对象id以Cookie的形式发给客户端
-
客户端再次访问服务器端(severlet),发现他带了一个sessionid,就会查找对应的session对象
-
如何获得session对象 直接调用 request.getSession() 一定返回一个session对象,我们就可以直接使用
-
getSession()细节
- 第一次来,没有携带jsessionid ,就创建一个新的session
- 第二次来,携带jsessionid ,根据这个jsessionid去查找对应的session,如果找到就直接返回
携带jsessionid,根据这个jsessionid找不到对应的session,重新创建一个session并返回
1.2 Session方法
1.2.1 细节
//获取session对象,如果客户端没有对应的session对象,则创建新的session对象并返回
HttpSession session = request.getSession();
//设置数据
session.setAttribute("username", "wangwu");
//获取数据
session.getAttribute("username");
//删除数据
session.removeAttribute("username");
共享对象
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*
* 使用session对象实现数据的共享
* 域对象,整个会话
*/
//获取session对象
//获取session对象,如果客户端没有对应的session对象,则创建新的session对象并返回
HttpSession session = request.getSession();
//获取session对象
//参数是true,如果客户端没有对应的session对象,则创建新的session对象并返回
//参数是false,如果客户端没有对应的session对象,则返回null
//request.getSession(create);
//设置数据
session.setAttribute("username", "wangwu");
//删除数据
//session.removeAttribute("username");
//获取数据
Object obj = session.getAttribute("username");
System.out.println("SessionDemo2:" + obj);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
HttpSession session = request.getSession();
//获取数据
Object obj = session.getAttribute("username");
System.out.println("SessionDemo3:" + obj);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
HttpSession session = request.getSession();
//设置数据
//session.setAttribute("username", "lisi");
User user = new User("itheima","qwerty");
session.setAttribute("user", user);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session对象
HttpSession session = request.getSession();
//获取数据
//Object obj = session.getAttribute("username");
//System.out.println(obj);
Object obj = session.getAttribute("user");
System.out.println(obj);
}
1.3 案例详解
1.3.1 初始化数据
创建User对象
用户类 User
模拟数据库 UserDB
public class User implements Serializable {
private String username;
private String password;
public User() {
super();
// TODO Auto-generated constructor stub
}
public User(String username, String password) {
super();
this.username = username;
this.password = password;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
初始化数据
public class UserDB {
private static List<User> users = new ArrayList<User>();
static {
users.add(new User("itcast","123456"));
users.add(new User("itheima","qwerty"));
users.add(new User("zhangsan","password"));
}
public static List<User> getUsers() {
return users;
}
}
登录页面
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流对象
PrintWriter out = response.getWriter();
//实现登陆页面
out.println("<html>");
out.println("<head>");
out.println("<title>登陆页面</title>");
out.println("</head>");
out.println("<body>");
out.println("<form action='/mySession/LoginServlet' method='post' >");
out.println("用户名:<input type='text' name='username' />");
out.println("<br />");
out.println("密码:<input type='password' name='password' />");
out.println("<br />");
out.println("<input type='submit' value='登陆' />");
out.println("</form>");
out.println("</body>");
out.println("</html>");
}
登录功能
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用session实现用户登陆
//设置响应的类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流对象
PrintWriter out = response.getWriter();
//获取用户名
String username = request.getParameter("username");
//获取密码
String password = request.getParameter("password");
//获取所有的用户数据
List<User> users = UserDB.getUsers();
//遍历集合
for (User user : users) {
//判断用户所输入的用户名和密码是否正确
if(user.getUsername().equals(username) && user.getPassword().equals(password)) {
out.println("登陆成功!3秒后跳转到首页!");
response.setHeader("Refresh", "3;URL=/mySession/IndexUIServlet");
//用户名和密码正确,登陆成功后将用户名添加到session对象中
HttpSession session = request.getSession();
session.setAttribute("username", username);
return;
}
}
out.println("用户名或者密码不正确!3秒后跳转到登陆页面!");
response.setHeader("Refresh", "3;URL=/mySession/LoginUIServlet");
}
注销功能
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流对象
PrintWriter out = response.getWriter();
//获取session对象
HttpSession session = request.getSession();
//删除数据,删除用户在session中的数据
//session.removeAttribute("username");
//销毁session对象
session.invalidate();
out.println("注销成功!3秒后跳转到首页!");
response.setHeader("Refresh", "3;URL=/mySession/IndexUIServlet");
}
根据session内容响应
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的类型和编码
response.setContentType("text/html;charset=UTF-8");
//获取输出流对象
PrintWriter out = response.getWriter();
//获取session对象
HttpSession session = request.getSession();
//获取用户的登陆状态
Object username = session.getAttribute("username");
//实现首页
out.println("<html>");
out.println("<head>");
out.println("<title>首页</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>itheima</h1>");
if(username == null) {
//username为null,说明session中没有用户的数据,用户没有登陆成功
out.println("<a href='/mySession/LoginUIServlet' >登陆</a>");
}
else {
//username不为null,session中有用户的数据,用户已经登陆成功了
out.println("欢迎您" + username);
out.println("<a href='/mySession/LogoutServlet'>注销</a>");
}
out.println("<hr />");
out.println("</body>");
out.println("</html>");
}
1.3 Session的补充
1.3.1 session对象的生命周期
- 一个对象从创建到销毁的整个过程
- 时间:
- 创建: 第一次调用getSession()创建Cookie对象
- 销毁:
- 超时 默认30分钟(从最后一次请求算起)
- 手动调用invalidate()方法
-
非正常关闭服务器
session对象的生命周期.png
1.3.2 钝化
- 当我们使用正确的方式关闭tomcat,tomcat会把session对象以及session对象所存储的数据持久化到tomcat的work目录下,
- 以便tomcat再次启动的时候可以恢复这些数据
- 使用类封装的时候需要实现序列化接口
网友评论