E017Web学习笔记-Cookie和Session(二)

一、Session快速入门

1、概念

服务器端会话技术,在一次会话的多次请求间共享数据,将数据存储在服务器,HttpSession;

 

2、快速入门

获取HttpSession对象

//1、获取session
HttpSession session = req.getSession();
HttpSession getSession();

使用HttpSession对象

//2、为session设置数据
session.setAttribute("msg","Hello Session!");
void setAttribute(String name, Object obj);

//3、使用Session获取数据
Object msg = session.getAttribute("msg");
Object getAttribute(String name);

//4、移除数据
session.removeAttribute("msg");
void removeAttribute(String name);

代码演示:

MyServlet:

package com.zibo.servlet;

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;

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet……");
        System.out.println("转到doPost……");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost……");
        //1、获取session
        HttpSession session = req.getSession();
        //2、为session设置数据
        session.setAttribute("msg","Hello Session!");
        //3、使用Session获取数据
        Object msg = session.getAttribute("msg");
        //4、移除数据
        session.removeAttribute("msg");
    }
}

SecondServlet:

package com.zibo.servlet;

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;

@WebServlet("/s1")
public class SecondServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //1、获取Session
        HttpSession session = req.getSession();
        //2、使用Session获取数据
        Object msg = session.getAttribute("msg");
        System.out.println(msg);
    }
}

 

3、原理分析

服务器如何在一次会话范围内,多次获取的Seesion对象是同一个;

Session的实现依赖于Cookie;

原理分析:

第一步:浏览器向服务器发送请求,服务器第一次获取Session,没有Cookie,服务器会在内存中创建一个新的Seeion对象,并通过Cookie的方式将该Session对象的id传给客户端;

第二步:客户端再次向服务器发送请求,会携带Cookie数据,Cookie包含了Session对象的id,服务器通过Session对象的id找到对应的Session对象;

 

二、Session细节

1、客户端关闭,服务器不关闭,两次获取的Session对象是同一个吗

答:默认情况下,不是!因为服务器创建了两次Session(ID不一样的);

实现客户端关闭后Session也能相同:

本质上是使用Cookie,设置存活时间,下次服务器获取Session对象的时候,根据Cookie获取而不是创建新的,服务器发送的Cookie信息内包含的Session对象的ID也是原来的Session对象的ID;

代码示例:(手动发Cookie)如下是MyServlet代码,SecondServlet见上面代码;

package com.zibo.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/my")
public class MyServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet……");
        System.out.println("转到doPost……");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost……");
        //1、获取session
        HttpSession session = req.getSession();
        //2、为session设置数据
        session.setAttribute("msg","Hello Session!");
        //3、手动发Cookie
        Cookie cookie = new Cookie("JSESSIONID",session.getId());
        cookie.setMaxAge(60*60);
        resp.addCookie(cookie);
    }
}

 

2、客户端不关闭,服务器关闭,两次获取的Session对象是同一个吗

答:不是同一个;因为服务器关闭,内存释放,内存中的Session对应也被释放了;

但可以确保数据不丢失:

session的钝化:

在服务器正常关闭之前,将session对象序列化到硬盘上保存;

session的活化:

在服务器启动后,将session文件转化为内存中的session对象(反序列化)即可;

Tomcat可以自动完成这件事情!

但是IDEA部署项目只能完成钝化,因为在IDEA启动Tomcat服务器的时候,会将work目录删除,再重新生成新的work目录,但不包含Session钝化的文件,那么原work目录下存放的Session钝化的文件,被删除了,无法读取到;不必担心,真正做项目的时候不要IDEA部署;

 

3、Session的什么时候被销毁

三种情况:

①服务器被正常关闭,session对象被销毁;

②session调用invalidate()方法,session对象被销毁;

③session默认失效时间是30分钟,可以更改这个时间;

更改session默认失效时间:

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

 

三、Session的特点

1、session是用于存储一次会话的多次请求间的数据,存放在服务器端;

2、session可以存储任意类型、任意大小的数据;

 

3、Session与Cookie的三大区别

①Session存储数再服务器端,Cookie存储数据在客户端;

②Session没有数据大小的限制,Cookie有;

③Session安全,Cookie相对不安全;

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值