一文通cookie和Session

举报
执久呀 发表于 2022/07/25 22:10:24 2022/07/25
【摘要】 ​ 目录简介Cookie基本使用发送Cookie 获取Cookie Cookie原理 Cookie使用细节cookie存活时间Cookie存储中文简介会话:用于打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话可以包含多次请求和响应(同一浏览器发送的多次请求为一次会话,不同浏览器发送请求属于不同的会话)会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次...

 目录

简介

Cookie基本使用

发送Cookie

 获取Cookie

 Cookie原理

 Cookie使用细节

cookie存活时间

Cookie存储中文


简介

会话:

用于打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话可以包含多次请求和响应(同一浏览器发送的多次请求为一次会话,不同浏览器发送请求属于不同的会话)

会话跟踪

一种维护浏览器状态的方法,服务器需要识别多次请求是哦否来自同一浏览器,以便在同一次会话的多次请求间共享数据(服务器无法识别每次请求是否来自同一浏览器)

HTTP协议是无状态的,每次浏览器向服务器时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术。(设置为无状态是为了响应速度)

Cookie和session就是用来解决一次会话间多次请求间数据共享的问题。

实现方式:

1、客户端会话跟踪技术:Cookie

2、服务端会话跟踪技术:Session

编辑

Cookie基本使用

Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问

Cookie基本使用

发送Cookie

1、创建Cookie对象,设置数据

Cookie cookie=new Cookie("key","value");

2、发送Cookie到客户端:使用response对象

response.addCookie(cookie);

1、在src下创建一个com包下CookieServlet类

package com;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //发送Cookie
        //创建Cookie对象
        Cookie cookie=new Cookie("username", "zhangsan");
        //2、Cookie,response
        resp.addCookie(cookie);
    }
}

2、web.xml配置

    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

启动访问即可,f12查看

编辑

 获取Cookie

3、获取客户端携带的所有Cookie,使用request对象

Cookie[] cookie=request.getCookie();

4、遍历数组,获取每一个Cookie对象:for

5、使用Cookie对象方法获取数据

cookie.getName();
cookie.getValue();

 创建CookieServlet1类,再配置web.xml

package com;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //3、获取cookie数组
        Cookie[] cookies=req.getCookies();
        //4、遍历数组
        for( Cookie cookie1:cookies){
            //5、获取数据
            String name=cookie1.getName();
            String value=cookie1.getValue();
            System.out.println("name="+name+"\nvalue="+value);
            System.out.println("-------------");
        }
    }
}

 先访问cookieServlet,在访问cookieServlet1得

编辑

 这就实现了,同一浏览器的两次访问(cookieServlet和cookieServlet1两次)数据共享

 Cookie原理

Cookie的实现是基于HTTP协议的

响应头:set-cookie

请求头:cookie

编辑

 访问时f12查看网络

编辑

 Cookie使用细节

cookie存活时间

默认情况下,cookie存储在浏览器内存中,当浏览器关闭,内存释放,则cookie被销毁

setMaxAge(int seconds):设置Cookie存活时间

①正数:将Cookie写入浏览器所在的电脑的硬盘,持久化存储,到时间自动删除

②负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭时,则Cookie被销毁

②零:删除对应Cookie 

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //发送Cookie
        //创建Cookie对象
        Cookie cookie=new Cookie("username", "zhangsan");
        //设置存活时间 比如一周
        cookie.setMaxAge(60*60*24*7);
        //2、Cookie,response
        resp.addCookie(cookie);


    }

Cookie存储中文

Cookie默认不能存储中文

如果需要储存,则需要进行转码:URL编码

 默认情况不支持中文:

编辑


CookieServlet类下

public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //发送Cookie
        //创建Cookie对象

        String value="张三";
        //URL编码
         value= URLEncoder.encode(value, "UTF-8");
           Cookie cookie=new Cookie("username", value);
        //设置存活时间 比如一周
        cookie.setMaxAge(60*60*24*7);
        //2、Cookie,response
        resp.addCookie(cookie);


    }
}

 CookieServlet1类下

public class CookieServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //3、获取cookie数组
        Cookie[] cookies=req.getCookies();
        //4、遍历数组
        for( Cookie cookie1:cookies){
            //5、获取数据

            String name=cookie1.getName();
            String value=cookie1.getValue();
            //URL解码
           value=URLDecoder.decode(value,"UTF-8" );
            System.out.println("name="+name+"\nvalue="+value);
            System.out.println("-------------");
        }
    }
}

编辑



Session介绍

服务端会话跟踪技术:将数据保存到服务端

JavaEE提供HttpSession接口,来实现一次会话的多次请求间数据共享功能

使用:

1、获取Session对象

HttpSession session=request.getSession();

2、Session对象功能

void setAttribute(String name,Object o);//存储数据到session域中
Object getAttribute(String name);//根据key获取value值
void removeAttribute(String name);//根据key,删除键值对

编辑



创建两个类SessionServlet和SessionServlet1

package com;


import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //存储到session中
        //1、获取session对象
        HttpSession session=req.getSession();
        //存储数据
        session.setAttribute("username","root");

    }
}
public class SessionServlet1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //获取数据。从session中
        //1获取session对象
        HttpSession session=req.getSession();
        //获取数据
        Object username=session.getAttribute("username");
        System.out.println("获取到的session值为"+username);
        
    }

web.xml配置两个类的访问地址

   <servlet>
        <servlet-name>SessionServlet1</servlet-name>
        <servlet-class>com.SessionServlet1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet1</servlet-name>
        <url-pattern>/sessionServlet1</url-pattern>
    </servlet-mapping>


    <servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>com.SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/sessionServlet</url-pattern>
    </servlet-mapping>

先访问①后访问②运行得

编辑

 Session原理

Session是基于Cookie实现的

获取的对象有唯一的标识id的,tomcat把session的id当成cookie发送给浏览器,tomcat在响应是会加上set-cookie这个响应头JSESSIONID=值存储到浏览器内存中,第二次获取时就会去内存中寻找有无id为之前的,有就直接用那数据,没有就创建


编辑

 Session使用细节

Session钝化、活化

服务器重启,Session中的数据还会存在?

钝化:在服务器正常关闭后,Tomcat会自动将Session数据写入硬盘文件中

活化:在次启动服务器后,从文件中加载数据到Session中

Session销毁:

①默认情况下,无操作30分钟后自动销毁(下列单位分钟)

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

②调用Session对象的invalidate()方法

浏览器一关,session就销毁了,因为session是通过cookie传输

小结

Cookie和Session都是来完成一次会话内多次请求间数据共享的

区别:

存储位置:Cookie是将数据存储在客户端,Session将数据储存在服务器

安全性:Cookie不安全,Session安全

数据大小:Cookie最大3KB,Session无大小限制

存储时间:Cookie可以长期存储,Session默认30分钟

服务器性能:Cookie不占服务器资源,Session占用服务器资源

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。