Cookie和Session 快速入门笔记

网页左边,向下滑有目录索引,可以根据标题跳转到你想看的内容

一、Cookie

会话
浏览器第一次给服务器发请求时,会话建立,直到某一方断开,会话结束
一次会话中包含多次请求和响应
作用:一次会话的生命周期范围内,共享数据
会话方式
客户端会话技术:Cookie
服务器端会话技术:Session
使用步骤
1、创建Cookie对象,绑定数据,new Cookie(String name,String value)
2、服务器发送Cookie对象给前端,response.addCookie(Cookie cookie)
浏览器获取Cookie,之后生命周期内发送请求会携带Cookie信息
3、获取Cookie,拿数据

Cookie和Session 快速入门笔记_第1张图片
Cookie和Session 快速入门笔记_第2张图片

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        System.out.println("我是dome1Get");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        //1、创建Cookie对象
        Cookie cookie = new Cookie("name", "value");
        //2、发送Cookie对象
        resp.addCookie(cookie);
    }

Cookie和Session 快速入门笔记_第3张图片

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
    System.out.println("我是dome2Post");
}

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
    System.out.println("我是dome2Get");
    //3、获取Cookie
    Cookie[] cookies = req.getCookies();
    //4、获取数据
    if(cookies != null){
     
        for(Cookie cookie : cookies){
     
            String name = cookie.getName();
            String value = coo kie.getValue();
            System.out.println("Cookie信息"+name+"    "+value);
        }
    }
}
细节
1、可以同时发送多个cookie对象,创建多个然后多次调用response.addCookie()方法发送cookie
2、默认情况下Cookie存在浏览器内存中,浏览器关闭,cookie失效清空
3、cookie可以存储中文,tomcat8之前不能直接存储中文,需要将中文数据转码,一般采用URL编码,tomcat8之后,支持直接存储中文数据
4、默认情况下,多个web项目不能共享cookie,可以通过setPath(String path)设置cookie的获取范围,默认情况下,设置当前的虚拟目录
特点
cookie数据存储在客户端
浏览器对单个cookie的大小(一般最大4kb左右)和同域名下cookie总数量(一般最大20个)有限制
设置cookie失效时间,持久化存储
setMaxAge(int seconds):seconds是正数表示将cookie数据写到硬盘文件中,数据可以存活的时间,30就是30秒。负数就是默认值。零表示删除cookie信息

Cookie和Session 快速入门笔记_第4张图片

设置cookie的共享范围

Cookie和Session 快速入门笔记_第5张图片在这里插入图片描述

案例
访问一个servlet,如果是第一次访问,提示您好,欢迎首次访问
如果不是第一次访问,提示,欢迎回来,您上次访问时间是:…
做法很简单,在客户端存储一个cookie信息,保存访问时间,当用户访问servlet时,我们获取cookie没有就提示首次访问,并保存cookie,有就获取cookie信息,显示上次访问时间,并替换cookie信息为用户这次访问时间

Cookie和Session 快速入门笔记_第6张图片Cookie和Session 快速入门笔记_第7张图片

package com.yzpnb.servlet;

import javax.servlet.*;
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.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * Request快速入门
 */
@WebServlet("/dome1")
public class Dome1 extends HttpServlet {
     
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        System.out.println("我是dome1Get");
        this.doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        resp.setContentType("text/html;charset=UTF-8");//设置响应格式

        //设置响应体cookie,是当前时间
        String format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss").format(new Date());
        //编码,因为我们数据中有空格等特殊符号,而cookie不能存储此类数据,所以需要编码,否则报500异常
        format = URLEncoder.encode(format, "utf-8");
        Cookie info = new Cookie("info", format);

        info.setMaxAge(60*60*24*30);//cookie保存一个月

        boolean flag = true;//用来判断是否首次登陆


        Cookie[] cookies = req.getCookies();//获取请求体cookie

        if(cookies!=null && cookies.length > 0){
     
            for (Cookie cookie:cookies) {
     
                if("info".equals(cookie.getName())){
     //如果具有名为info的cookie,代表非首次访问
                    String value = cookie.getValue();//获取cookie值
                    //因为cookie中是编码后数据,需要解码使用
                    value = URLDecoder.decode(value,"utf-8");

                    resp.getWriter().write("欢迎回来,您上次访问时间是"+value);//响应数据
                    flag = false;//代表不是首次访问
                }
            }
        }

        if(flag){
     //首次访问
            resp.getWriter().write("您好,欢迎首次访问:首次访问时间"+URLDecoder.decode(format,"utf-8"));
        }

        resp.addCookie(info);//更新cookie信息

    }
}

二、JSP快速入门

jsp就是一个Servlet,它为了简化代码书写,让我们可以像写html一样编写jsp文件,最终它会将jsp页面转换为java代码

jsp脚本
<% 代码 %>:在这里的代码,最终会转到service方法中,也就是service中可以写什么,这里就可以写什么
<%! 代码 %>:在这里的代码,是用来定义成员的,最终会直接转到Servlet中,比如定义成员变量,成员方法
<%= 代码 %>:这里的代码,是用来输出的,最终会直接转到Servlet中,用来动态输出数据

在这里插入图片描述Cookie和Session 快速入门笔记_第8张图片

jsp内置对象
因为jsp是一个Servlet,所以我们在类中定义的方法对象,可以在jsp中直接使用,比如其中定义了一个out对象,此对象封装着response的输出对象,这就是一个内置对象,可以直接在jsp中使用,一共9个,这里简单介绍3个
response:就是Servlet的响应体对象
request:Servlet的请求体对象
out:将数据输出到页面上,字符输出流对象,和response.getWriter()类似,out写在哪里,就会在哪里输出,但是因为response响应优先级高,所以response的响应都会优先,会打乱我们页面元素顺序,所以使用out来输出数据到页面

三、Session

Session
服务器端的会话技术,在一次会话的多次请求间共享数据,将数据保存到服务器的对象HttpSession

Cookie和Session 快速入门笔记_第9张图片
上面的set-cookie信息第一次是在响应头中的,之后不会存到客户端,而是在请求头中继续存在

特点
存储一次会话,存在与服务端
可存储任意类型,任意大小数据
session存储到服务端,cookie存到客户端
session没有数据大小限制,cookie有
session数据安全,cookie相对不安全
细节
客户端关闭后,服务端不关闭,两次获取的session不是同一个(默认情况下不是),如果想要相同,可以创建名为JSESSIONID值为session对象id(session.getId();)的cookie对象,然后设置失效时间,添加到响应体中,这样就可以两次请求到相同session对象了
客户端不关闭,服务端关闭,两次获取的session对象不是同一个,因为服务端关闭,内存被释放,session就销毁了,解决办法就是session对象不同,但是数据不可丢失,这就涉及到session的钝化(服务端正常关闭之前将session数据保存到硬盘)session的活化(服务端启动之后将保存的session转化为内存中的session对象),这两件事tomcat自动帮我们完成(注意,使用开发工具正常关闭tomcat不管用,必须打war包等方法部署,tomcat才做这件事)
session的销毁,服务器关闭全部销毁,session对象调用invalidate()方法自动销毁,session默认失效时间是30分钟,可以改web.xml配置修改模式时间(< session-config>标签中修改即可)
HttpSession
和request域一样,session域也有以下方法
object getAttribute(String name):域中获取指定键对应的值
void setAttribute(String name,Object value):域中添加键值对
void removeAttribute(String name):域中移除指定键

Cookie和Session 快速入门笔记_第10张图片Cookie和Session 快速入门笔记_第11张图片

@Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        //1、获取session
        HttpSession session = req.getSession();
        //2、存储数据
        session.setAttribute("sessionMsg","oneSession");
        resp.sendRedirect("dome2");

    }

Cookie和Session 快速入门笔记_第12张图片

@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     
        System.out.println("我是dome2Get");
        resp.setContentType("text/html;charset=utf-8");
        //3、获取session
        HttpSession session = req.getSession();
        //4、获取session数据
        Object sessionMsg = session.getAttribute("sessionMsg");
        resp.getWriter().write("session数据为"+sessionMsg);
    }

你可能感兴趣的:(java,web,java,session,cookie,servlet)