Cookie与Session

Http是一个无状态的协议,每一次的请求都是独立的,请求之间无法实现数据共享

一次会话:浏览器第一次给服务器资源发送请求 会话建立 直到有一方断开为止

会话:一次会话中包含多次请求和响应(浏览器给服务器发送数据:一次请求,服务器给浏览器反馈数据:一次响应)

功能:在一次会话的范围内的多次请求共享数据

方式:客户端会话技术   Cookie    服务器端会话技术  Session

Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。

Cookie操作

//1. Cookie(String name, String value)  实例化Cookie对象,传入cooke名称和cookie的值
Cookie cookie = new Cookie("hello","hello");
//2. public String getName() 取得Cookie的名字
String name = cookie.getName();
//3. public String getValue()  取得Cookie的值
String value = cookie.getValue();
//4. public void setValue(String newValue) 设置Cookie的值 设置Cookie的值
cookie.setValue("你好");
//5. public void setMaxAge(int expiry)  设置Cookie的最大保存时间
//设置Cookie的最大保存时间,即cookie的有效期,当服务器给浏览器回送一个cookie时,
// 如果在服务器端没有调用setMaxAge方法设置cookie的有效期,那么cookie的有效期只在一次会话过程中有效,
// 用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话,
// 当用户关闭浏览器,会话就结束了,此时cookie就会失效,
//	1.默认情况下 当浏览器关闭后 Cookie数据被销毁
//    	2.设置Cookie的生命周期 持久化存储:
//       setMaxAge(int second);
//          1.正数:将Cookie数据写到硬盘的文件中 持久化存储 cookie的存活时间
//          2.负数:默认值 浏览器一关 cookie数据销毁
//          3.零:删除cookie信息
cookie.setMaxAge(60*60);
//6. public int getMaxAge()  获取Cookies的有效期
int maxAge = cookie.getMaxAge();
//7.public void setPath(String uri)
//设置cookie的有效路径,比如把cookie的有效路径设置为"/xdp",那么浏览器访问"xdp"目录下的web资源时,
// 都会带上cookie,再比如把cookie的有效路径设置为"/xdp/gacl",那么浏览器只有在访问"xdp"目录下的"gacl"
// 这个目录里面的web资源时才会带上cookie一起访问,
// 而当访问"xdp"目录下的web资源时,浏览器是不带cookie的
cookie.setPath("/"); //表示当前所有的资源都能够共享该Cookie信息

Cookie应用实例

ackage com.cookie.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 示例:使用cookie记录用户上一次访问的时间
 */
@WebServlet("/hello")
public class Servlet01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        boolean flag = false;
        //设置服务器端以UTF-8编码进行输出
        response.setCharacterEncoding("utf-8");
        //设置浏览器以UTF-8编码进行接收,解决中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //获取客户传来的cookie数组
        Cookie[] cookies = request.getCookies();
        if(cookies!=null && cookies.length>0){
            //遍历cookies
            for(Cookie cookie : cookies){
                //如果有名字为lastTime的cookie
                if("lastTime".equals(cookie.getName())){
                    flag = true;
                    //获取cookie的值
                    String value = cookie.getValue();
                    out.write("您上次的登录时间是:"+value);
                    //把当前时间保存到cookie中
                    Date date = new Date();
                    SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
                    String now = sf.format(date);
                    cookie.setValue(now);
                    //更新cookie
                    response.addCookie(cookie);
                    break;
                }
            }
        }
        if ( cookies==null ||cookies.length==0 || flag==false){
            //第一次访问
            Date date = new Date();
            SimpleDateFormat sf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
            String now = sf.format(date);
            Cookie cookie = new Cookie("lastTime",now);
            cookie.setMaxAge(24*60*60);
            response.addCookie(cookie);
            out.write("这是您第一次访问本站");
        }
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request, response);
    }
}

******************************************************************** 

Session

是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

Session 服务器端会话技术 
    1.在一次会话的多次请求间共享数据 将数据保存在服务器端的对象中 httpSession
    2.快速入门
        1.获取HttpSession对象
        HttpSession session = request.getSession();
        2. 使用HttpSession对象
        session.setAttribute("msg","hello session");
        session.getAttribute("msg");

    3.原理
        Session的实现时依赖于Cookie
        服务器如何确保在一次会话范围内 多次获取的Session对象是同一个?
        第一次获取Session 没有Cookie 会在内存中创建一个新的Session对象 
    4.细节:
        1.当客户端关闭后,服务器不关闭,两次获取的session是否为同一个?
            默认情况下不是
            如果需要相同 则可以创建cookie 键为JSESSIONID 设置最大存活时间 让cookie持久化
            Cookie c  = new Cookie("JSESSIONID" , session.getId());
            c.setMaxAge(60*60);
            response.addCookie(c);
        2.客户端不关闭 服务器关闭后 两次获取的session是同一个?
            服务器关闭 session就被销毁了 不是同一个 但是要确保数据不丢失
            session的钝化:序列化  将对象转成二进制数据
                在服务器正常关闭之前 将session对象序列化到硬盘上
            session的活化:反序列化 
                在服务器启动后,将session文件转化为内存中的session对象即可
        3.session的失效时间问题
            1.服务器关闭
            2.session调用方法 invalidate()
            3.session默认失效时间 30分钟

Session的特点
    session用于存储一次会话的多次请求的数据 存在服务器端
    session可以存储任意类型 任意大小的数据

    session与cookie的区别
        session存储数据在服务器端 cookie在客户端
        session没有数据大小限制 cookie有
        session数据安全 cookie相对于不安全

 

 

 

你可能感兴趣的:(javaweb基础)