【JavaWeb】Cookie&&Session(32)

引言

会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

知识点总结

在这里插入图片描述

Cookie

会话技术

会话就是指浏览器从打开到关闭的过程,服务器不会自动保存我们的操作信息,这时候就需要用到会话技术(Cookie&Session)。
下面是谷歌浏览器的保存Cookie的设置页面;
在这里插入图片描述

概念

Cookie是客户端会话技术,可以将数据保存到客户端(浏览器);

快速实现

1.创建Cookie对象

new Cookie(String name, String value) 

2.发送cookie对象

response.addCookie(Cookie cookie) 

3.访问cookie对象

Cookie[]  request.getCookies()  
Demo01中创建并上传cookie
==============
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.net.URLEncoder;

@WebServlet("/cookieDemo01")
public class CookieDemo01 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       String value="helloCookie";
         Cookie  ck1=new Cookie("msg", value2);
        response.addCookie(ck1);
    }

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

Demo02中获取
==========
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.net.URLDecoder;
import java.net.URLEncoder;

@WebServlet("/cookieDemo02")
public class CookieDEMO02 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cks = request.getCookies();
        for (Cookie ck : cks) {
            String name=ck.getName();
            String value= ck.getValue();
            System.out.println(name+"=="+value);
        }
        
    }

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

原理

在上传cookie之后,响应行里会出现set-Cookie响应头;
在这里插入图片描述
获取Cookie时,请求行里也会出现Cookie请求头;
在这里插入图片描述

注意事项

1.一次可以发送多个Cookie

        Cookie  ck1=new Cookie("msg", value2);
        Cookie  ck2=new Cookie("msg","helloJava");
        Cookie  ck3=new Cookie("name","helloAXiao");
        response.addCookie(ck1);
        response.addCookie(ck2);
        response.addCookie(ck3);

2.Cookie的存储时间
默认情况下,浏览器关闭,Cookie随之被销毁;
但是可以用 setMaxAge(int seconds) 设置Cookie存储时间

setMaxAge(int num)
--------
num>0  >> 存储时间
num<0  >>表示销毁cookie
num==0 >>默认情况
=================
        Cookie  ck1=new Cookie("msg", value2);
         ck1.setMaxAge(60);
         //60秒后销毁
        response.addCookie(ck1);

3.Cookie的获取范围

	1. 在一个tomcat服务器中,部署了多个web项目
		* 默认情况下cookie不能共享
        * setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
		* 如果要共享,则可以将path设置为"/"

			
    2. 不同的tomcat服务器间cookie共享问题?
		 * setDomain(String path):如果设置一级域名相同,那么多个服务器之间cookie可以共享
		 * setDomain(".baidu.com"),那么tieba.baidu.com和news.baidu.com中cookie可以共享

4.Cookie存中文
Tomcat8之后就可以存中文了,但是特殊字符(像空格),还是要用URL编码存储;

特点

特点:
    1. cookie存储数据在客户端浏览器
    2. 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20)
作用:
	1. cookie一般用于存出少量的不太敏感的数据
	2. 在不登录的情况下,完成服务器对客户端的身份识别

案例

第一次访问:
在这里插入图片描述
再一次访问:
在这里插入图片描述
代码展示

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.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/CookieDemo03")
public class CookieDemo03 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = request.getCookies();
        boolean flag=false;//判断是否为第一次
        for (Cookie cookie : cookies) {
            String name=cookie.getName();
            if("loginTime".equals(name)==true){
                flag=true;
                String time=cookie.getValue();
                System.out.println("欢迎回来,您上次访问的时间是"+time);
                response.getWriter().write("欢迎回来,您上次访问的时间是"+time);
                Date date=new Date();
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日:HH时mm分ss秒");
                String str = sdf.format(date);
                cookie.setValue(str);
                break;
            }
        }
        if(flag==false){
            response.getWriter().write("<h1>欢迎您首次访问,祝您愉快哟</h1>");
            Date date=new Date();
            SimpleDateFormat sdf=new SimpleDateFormat("yyyy年MM月dd日:HH时mm分ss秒");
            String str = sdf.format(date);
             Cookie cookie=new Cookie("loginTime",str);
             response.addCookie(cookie);

        }
    }

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

Session

概念

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

快速上手

1.获取HttpSession对象

 HttpSession session = request.getSession();

2.使用HttpSession对象

Object getAttribute(String name)  
void setAttribute(String name, Object value)
	name是数据的标识符,value是数据
void removeAttribute(String name)  

原理

Session的实现是依赖于Cookie的;
在这里插入图片描述

细节

1.客户端关闭,服务器端不关闭时,两次获取的session是同一个吗?

  *默认情况下不是,因为session是依赖于cookie的,二者都是存在于一次会话中;
  *可以设置cookie,键位JSESSIONID;
   Cookie ck=new Cookie("JSESSIONID",session.getId());
        ck.setMaxAge(60*60);
        response.addCookie(ck);

2.客户端不关闭,服务器端关闭时,两次获取的session是同一个吗?

 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
		* session的钝化:
			* 在服务器正常关闭之前,将session对象系列化到硬盘上
		* session的活化:
			* 在服务器启动后,将session文件转化为内存中的session对象即可。

3.session什么时候被销毁?

1. 服务器关闭
2. session对象调用invalidate() 
//使session失效
4. session默认失效时间 30分钟
		(web.xml中)选择性配置修改	
				<session-config>
			        <session-timeout>30</session-timeout>
			    </session-config>

特点

1.session用于一次会话的多次请求的数据,存在服务器;
2.session可以存储任意类型,任意大小的数据;
3.与cookie的区别

* session数据存储在服务器,cookie数据储存在客户端;
* session没有数据限制,cookie有
* session相对于cookie更安全;

案例

https://blog.csdn.net/alpha_xia/article/details/108457134
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高冷小伙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值