天天看点

Javaweb会话跟踪技术(Cookie和Session)一、会话跟踪技术概述二、Cookie三、Session四Cookie和Sesion区别

目录

一、会话跟踪技术概述

二、Cookie

1.Cookie基本原理

2.Cookie基本使用

3.Cookie存活时间

4.cookie存储中文

三、Session

1.Session钝化、活化

2.Session基本使用

3.sesion销毁 

四Cookie和Sesion区别

一、会话跟踪技术概述

1.会话:用户打开浏览器,访问网页资源,会话就建立了。直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

2.会话跟踪:一种维护浏览器状态的方法,服务器需要多次识别请求是否来自同一个浏览器,以便在同一次会话中的多次请求共享数据。

3.为什么要共享数据?

答:因为HTTP协议是无状态的,每次浏览器向服务器请求时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术来实现会话内数据共享。

4.实现方式

客户端会话跟踪技术:Cookie

服务端会话跟踪技术:Session

二、Cookie

1.Cookie基本原理

 cookie的实现是基于HTTP协议的

发送cookie到浏览器:响应头:set-cookie

携带cookie访问服务器:请求头:cookie

2.Cookie基本使用

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

ps:我们主要是做服务端的开发,那么使用这个Cookie。首先就是要把这个Cookie发送到客户浏览器,以后客户浏览器就可以获取这个Cookie去进行访问其他的Servlet。

(1)发送cookie

使用response对象 

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

import java.io.IOException;


@WebServlet("/res")
public class res extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        //1.创建Cookie对象
        Cookie cookie = new Cookie("username","666");

        //2.发送Cookie,response
        response.addCookie(cookie);
    }

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

 查看方法:F12或者检测--应用程序--查看cookie就可以看到了(这是edge浏览器)

Javaweb会话跟踪技术(Cookie和Session)一、会话跟踪技术概述二、Cookie三、Session四Cookie和Sesion区别

(2)获取cookie

 使用request对象

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

import java.io.IOException;


@WebServlet("/res")
public class res extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取Cookie
        //1.获取Cookie数组
        Cookie[] cookies = request.getCookies();

        //2.遍历数组
        for (Cookie cookie : cookies) {
            //获取键
            String name = cookie.getName();
            //获取值,要先判断一下需要的值获取出来就好了
            if ("username".equals(name)){
                //获取对应的值
                String value = cookie.getValue();
                //打印
                System.out.println(name+":"+value);
                //获取到了对应的值就终止
                break;
            }
        }
    }

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

运行结果:控制台输出

username:666

3.Cookie存活时间

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

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

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

2.负数:默认值,cookie随着浏览器的关闭而销毁

3.零:删除对应的cookie

存储七天的例子

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;

import java.io.IOException;


@WebServlet("/res")
public class res extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //发送Cookie
        //1.创建Cookie对象
        Cookie cookie = new Cookie("username","666");

        //设置cookie存活7天 60是秒
        cookie.setMaxAge(60*60*27*7);

        //2.发送Cookie,response
        response.addCookie(cookie);

    }

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

其实就一行代码

cookie.setMaxAge(60*60*27*7);
           

4.cookie存储中文

cookie不能直接存储中文

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

三、Session

session是基于cookie的 

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

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

如果数据存储在cookie里面,每次访问带来带去,就会造成泄露的隐患,所以使用Sessoin比较好一点

1.Session钝化、活化

服务器在重启后,sesion中的数据是否还存在

钝化:在服务器正常关闭后,Tomacat会自动将sesion数据写入到硬盘中

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

2.Session基本使用

存储Session 

package com.project.JavaScript;

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

@WebServlet("/Session1")
public class Session1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //存储到session中
        //1.获取session对象
        HttpSession session = request.getSession();
        //2.存储数据
        session.setAttribute("username","KPL");
    }

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

 获取Session

package com.project.JavaScript;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.Enumeration;

@WebServlet("/Session2")
public class Session2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取数据,从session中
        //1.获取session对象
        HttpSession session = request.getSession();

        //2.获取数据
        Object username = session.getAttribute("username");
        System.out.println(username);

    }

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

运行结果为

KPL

3.sesion销毁 

默认情况下,无操作,30分钟自动销毁

更改为100分钟例子

在web.xml里面配置就好了

<session-config>
        <session-timeout>100</session-timeout>
    </session-config>
           

 立即销毁(销毁sesion自己)

session.invalidate();
           

四Cookie和Sesion区别

区别:

存储位置:cookie是将数据存储在客户端,sesion将数据存储在服务端

安全性:cookie不安全,sesion安全

数据大小:cookie最大3KB,sesion无大小限制

存储时间:cookie可以长时间存储,sesion默认30分钟

服务器性能:cookie不占用服务器资源,sesion占用服务器资源

继续阅读