6月5日——Cookie和Session
什么是cookie?
cookie是保存在客户端的特定数据,存在形式是保存在客户端本地硬盘中的一些文件,可以用于保存客户端的身份信息,同时也可以从cookie中获取用户的其他信息(用户访问的网站信息)
保存cookie
Cookie定义了HTTP请求头和HTTP响应头,通过HTTP的头信息使服务器可以与客户进行状态交互。比如客户端登录时选择了记住用户选项,请求服务器后,服务器需要记录用户状态,服务器会在响应信息中包含一个Set-Cookie的响应头,客户端会根据对应的响应头存储用户登录的Cookie信息或者JSESSIONID。再次请求服务器时,客户端会在请求信息中包含一个Cookie请求头,而服务器会根据这个请求头进行用户身份、状态等较验,若用户身份通过验证,则直接登录跳转到指定页面。
创建一个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

什么是session?
在基于Tomcat配置的服务器中,session是由Tomcat管理的对象,由ConcurrentHashMap实现(线程安全)
session可以译成会话的意思,指的是客户端与服务器连接成功后到断开连接的那段时间,也是一种记录客户端状态和信息的机制,主要是为了弥补HTTP协议的无状态(客户端完成一次请求和响应后便会断开连接,不会继续保持),与cookie不同的是,cookie是保存在客户端,而session是保存在服务器(每个客户端都有与之对应的session信息)。
客户端向服务器发送第一次请求,服务器会创建一个session对象存入内存中并返回一个sessionId,在响应客户端请求的时候将sessionId以cookie的形式返回给客户端,在会话结束前,客户端都可以用这个sessionId作为身份认证向服务器发送请求获取对应的信息。当你第一次访问服务器的时候,服务器会在内存中开辟一块空间用来存储你的信息,然后得到唯一一把打开该空间的钥匙,再把这把钥匙返回到浏览器。在会话结束前,就可以通过这把钥匙获取该空间的内容

服务器会通过这个JSESSIONID进行信息匹配,当浏览器关闭的时候,这个JSESSIONID也会一起删除
https://blog.csdn.net/zlbook/article/details/79409784
手动添加session
客户端的sessionId是服务器默认创建的,也可以根据需要,将一些用户信息添加到session中(如果添加到cookie,不安全),但是考虑到服务器的性能,session只保存比较敏感的用户信息,需要保存但是又不重要的信息则保存到cookie中。

只要客户端一直和服务器保持连接状态(客户端有操作),那么在有效期内这个session就会一直存在(默认时间30分钟),超过30分钟没有向服务器发送请求则会自动过期,也可以配置过期时间
<session-config><session-timeout>120</session-timeout><cookie-config><max-age>7200</max-age></cookie-config></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来命名
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 类名(参数列表){具体功能}
没有返回值类型,也没有返回值
用于创建对象,并初始化值
在创建对象时调用,只能调用一次
