6月5日——Cookie和Session

什么是cookie?

cookie是保存在客户端的特定数据,存在形式是保存在客户端本地硬盘中的一些文件,可以用于保存客户端的身份信息,同时也可以从cookie中获取用户的其他信息(用户访问的网站信息)
image.png

保存cookie

Cookie定义了HTTP请求头和HTTP响应头,通过HTTP的头信息使服务器可以与客户进行状态交互。比如客户端登录时选择了记住用户选项,请求服务器后,服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据对应的响应头存储用户登录的Cookie信息或者JSESSIONID。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验,若用户身份通过验证,则直接登录跳转到指定页面。
image.png
创建一个cookie对象,存储为键值对的方式,可以通过设置有效时间来使这个cookie信息到什么时候失效,如果不设置,默认是浏览器会话关闭的时候和session一起清除。

保存的cookie大小有限制,一般大小不能超过4096个字节,不同浏览器所允许保存的cookie个数也不相同(占内存,使请求头超过服务器的处理限制)

IE6.0 IE7.0/8.0 Opera Safari Chrome
个数 每个域20个 每个域50个 每个域30个 无限制 每个域53个
大小 4095字节 4095字节 4096字节 4097字节 4097字节

获取cookie

image.png

什么是session?

在基于Tomcat配置的服务器中,session是由Tomcat管理的对象,由ConcurrentHashMap实现(线程安全)
session可以译成会话的意思,指的是客户端与服务器连接成功后到断开连接的那段时间,也是一种记录客户端状态和信息的机制,主要是为了弥补HTTP协议的无状态(客户端完成一次请求和响应后便会断开连接,不会继续保持),与cookie不同的是,cookie是保存在客户端,而session是保存在服务器(每个客户端都有与之对应的session信息)。

客户端向服务器发送第一次请求,服务器会创建一个session对象存入内存中并返回一个sessionId,在响应客户端请求的时候将sessionId以cookie的形式返回给客户端,在会话结束前,客户端都可以用这个sessionId作为身份认证向服务器发送请求获取对应的信息。当你第一次访问服务器的时候,服务器会在内存中开辟一块空间用来存储你的信息,然后得到唯一一把打开该空间的钥匙,再把这把钥匙返回到浏览器。在会话结束前,就可以通过这把钥匙获取该空间的内容
image.png
image.png
服务器会通过这个JSESSIONID进行信息匹配,当浏览器关闭的时候,这个JSESSIONID也会一起删除
https://blog.csdn.net/zlbook/article/details/79409784

手动添加session

客户端的sessionId是服务器默认创建的,也可以根据需要,将一些用户信息添加到session中(如果添加到cookie,不安全),但是考虑到服务器的性能,session只保存比较敏感的用户信息,需要保存但是又不重要的信息则保存到cookie中。
image.png
image.png
只要客户端一直和服务器保持连接状态(客户端有操作),那么在有效期内这个session就会一直存在(默认时间30分钟),超过30分钟没有向服务器发送请求则会自动过期,也可以配置过期时间

  1. <session-config>
  2. <session-timeout>120</session-timeout>
  3. <cookie-config>
  4. <max-age>7200</max-age>
  5. </cookie-config>
  6. </session-config>

两者关联

在客户端和服务器建立连接的时候服务器就将sessionid放在了客户端的cookie中

共同点
都是用来跟踪客户端用户身份的会话方式
都具有一定的有效期,并且可以手动设置有效期

区别
1、保存位置不同,cookie是在客户端,session是在服务器
2、cookie有存储长度和数量的限制,并且存在安全隐患,可以通过分析本地的cookie文件进行cookie欺骗;session存储在服务器上,相对于cookie来说比较安全
3、cookie存放在客户端中,减少了服务器资源的占用,session存储在服务器,当用户访问量大的时候会占用较多的服务器资源。

6月23日——封装

将一些信息私有化—— private (将一些类中的信息隐藏起来,提高了代码的安全性)
1.方法是一种封装
2.使用关键字private修饰,让他不能超出本类范围(只有本类可以使用)
3.如果超出了本类的使用范围,可以间接使用,不能直接使用
间接使用(get/set方法):
设置值:
setXxx(小驼峰式)——名称必须和成员变量名一致
有参数无返回值(调用者将值赋值给本类成员变量)
获取值:
getXxx(小驼峰式)——名称必须和成员变量名一致
无参数有返回值(将本类成员变量的值返回给调用者)
返回值为布尔类型:isXxx(isPay-getPay)——名称必须和成员变量名一致
阿里巴巴发布的java开发手册中写明了,强制规定,布尔类型的数据,无论是boolean还是Boolean都不准使用isXXX来命名
image.png

public class Student {
    private boolean isDelete;
    private Boolean isUpdate;

    // 基本数据类型生成
    public boolean isDelete() {        // 在某些地方会出现异常(rpc框架-进程间通信框架)
        return isDelete;
    }
    public void setDelete(boolean delete) {
        isDelete = delete;
    }

    // 包装类型生成
    public Boolean getUpdate() {
        return isUpdate;
    }
    public void setUpdate(Boolean update) {
        isUpdate = update;
    }
}

_
this 关键字
问题描述:
当方法中的局部变量和成员变量重名时,会根据就近原则优先使用局部变量
解决方案:
使用 this 关键字

public void setName(String name) {
    this.name = name;    // 如果不用this。会有模糊的定义,不知道是参数赋值给参数,还是参数赋值给成员变量
}

public void setUserName(String name) {
    userName = name;    // 参数的名字和成员变量的名字不一致,没有使用this,明确指向该对象的成员变量
}

构造方法(给对象的数据进行初始化)
用来创建对象, new 就是在调用构造方法
格式:
public 类名 ( ){ } ——无参构造方法
public 类名 ( 参数列表 ) { } ——拥有成员变量的有参构造方法(有参数时创建对象可以直接传入参数而不使用set方法)

注意事项:
构造方法的名称必须和类名称相同,区分大小写
构造方法没有返回值类型
方法内部可以写 return ,但是不能写 return 返回值
当一个类没有写构造方法时,编译器会默认有一个无参构造方法(只有没写构造方法才会有默认)——(sql)
构造方法可以重载(方法名称相同,参数列表不同)

构造方法和成员方法的区别
成员方法:
可以任意起名
格式为 public void 方法名(){具体功能}
有返回值类型,有返回值
用于完成特定的功能
由创建好的对象调用,可以多次调用
构造方法:
方法名和类名相同
格式为 public 类名(参数列表){具体功能}
没有返回值类型,也没有返回值
用于创建对象,并初始化值
在创建对象时调用,只能调用一次