会话
这些会话里的东西都是针对http协议而言的,而且,对于一个类,如果想被外界访问到,那这个类必须是servlet,因为只有servlet能被外界访问
- 会话: 一次会话中包括多次请求和响应,比如说两个人之间交谈,肯定不只有一句话,然后以其中一个人不说话了离开了为结束.
- 什么是一次会话呢: 浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开请求连接为止.
- 会话的功能: 在一次会话的范围内的多次请求之间来实现共享数据.
- java中共享数据的两种方式:
- 客户端会话技术: cookie
- 服务器端会话技术: session
Cookie
-
概念: 它是客户端会话技术,它将数据保存在客户端.
-
cookie快速入门
-
使用步骤:
- 服务器端创建cookie对象,其中cookie是一个类,绑定数据.
- 通过javax.servlet.http包下的Cookie实体类中的构造方法:
public Cookie(String name, String value)
.
- 通过javax.servlet.http包下的Cookie实体类中的构造方法:
- 服务器端发送cookie对象.
- 通过javax.servlet.http包下的HttpServletResponse接口中的方法:
void addCookie(Cookie cookie)
.
- 通过javax.servlet.http包下的HttpServletResponse接口中的方法:
- 服务器端获取cookie,拿到数据.
- 通过javax.servlet.http包下的HttpServletRequest接口中的方法:
Cookie[] getCookies()
.
- 通过javax.servlet.http包下的HttpServletRequest接口中的方法:
- cookie发送数据代码.
- cookie接收数据代码.
- 注意,当这个servlet在同一个浏览器运行时,response能够正常获取数据,但是如果不在同一个浏览器运行,就不会获取到数据.
- 服务器端创建cookie对象,其中cookie是一个类,绑定数据.
-
cookie实现原理
- 基于响应头set-cookie和请求头cookie来实现,这个可以在浏览器运行servlet的时候通过F12查看网络中响应头和请求头的变化知道.
- 如图: .
- 我们要知道不论是发送cookie还是接收,都是以http协议的响应和请求形式来实现交互的.
-
-
一个小技巧:
- 每次我们在idea中创建servlet时每次都要自己去写urlPattern还要在get方法里面调用post方法,这个就有点麻烦,这个过程是可以省略的,我们可以在idea中设置servlet的模板来解决这个问题.
- 如图: .
-
cookie的细节内容
-
一次可不可以发送多个cookie?
- 可以
- 如何做到: 可以创建多个cookie对象,使用response调用多次addCookie()方法即可.
- 如果,多个servlet发送的cookie的键是相同的,虽然发送会都发送,但是接收的时候只会接收最后一个发送的,
- 假如两个甚至多个servlet中如果键都是"msg",最后得到的值只有最后发送的一个msg的值.
- 默认情况下,在浏览器没有关闭前,运行同一个src文件夹下面的某个servlet之后,然后运行其它servlet,我们都会发现前面运行过的servlet中cookie对象中的的键值对也会带过去,而且是在请求头中带过去,哪怕你重启了服务器,只要没有关闭浏览器,下次运行前面的值都还在.
- 在浏览器中,每个cookie对象只会有一个备份,怎么理解呢,就是说你不管调用多少次某个servlet,在请求头中都只会有一个该servlet中的键值对信息,不会因为你刷新了多次就有多个,这也就侧面验证了假如多个servlet有相同键的cookie,只会保留最后一个的结论.
-
cookie在浏览器中保存多长时间呢?
- 默认情况下: 当浏览器关闭后,cookie数据被销毁,说明cookie是存在于浏览器的内存中,也就是说重新打开浏览器就需要重新请求重新响应cookie数据.
- 设置cookie的生命周期让cookie实现持久化存储
- 使用cookie对象中的方法
setMaxAge(int seconds)
其中参数有三种取值:- 当参数为正数时: 表示将cookie数据写到硬盘数据中,也就是实现了持久化存储,其中这个参数的大小就表示了cookies对象的存活时间,例如参数为30,表示30秒以后cookie文件就会被自动删除,在30秒内关闭浏览器重新打开再次获取该cookie对象依旧存在.
- 当参数为负数时: 表示使用默认值.
- 当参数为0时: 表示删除cookie信息.
- cookie持久化存储示例案例.
- 使用cookie对象中的方法
-
能不能存中文呢?
- 在tomcat8之前,cookie中不能直接存储中文数据,在tomcat8之后,cookie支持中文数据存储,但是还是不支持特殊字符.
- 在cookie中不要使用符号,会报错的.
- 那么,如果要在tomcat7及之前存储中文数据或者现在在cookie中带特殊符号,如空格,逗号等,就需要将它们进行转码—一般采用URL编码.
- 怎么实现URL编码呢?下面的记住上一次访问时间案例中有,通过URLEncoder类中的静态方法encode(String s, String enc).
- cookie存储中文示例代码.
-
cookie获取的范围是多大呢,即共享问题.
- 假设在一个tomcat服务器中部署了多个web项目,那么在这些web项目中的cookie能不能共享?
- 默认情况下是cookie是不能共享的
- 但是可以通过方法:
setPath(String path)
来设置cookie获取的范围,默认该方法的参数设置为当前的虚拟目录.- 即不调用该方法等同于
cookie.setPath("/虚拟目录")
,表示只有在该虚拟目录下的资源,才能获取该cookie下的信息. - 当我们将方法写成这样的时候:
cookie.setPath("/")
,这表示在服务器根目录下的所有文件都可以访问该cookie下的信息,其中/
表示服务器根路径,即localhost/
,后面跟什么都行,例如localhost:8080/cookie/cookieServlet1
和localhost:8080/cookie1/cookieServlet1
都可以访问上面的cookie对象中的信息.
- 即不调用该方法等同于
- 不同的tomcat服务器间cookie共享问题(有印象就行)
- 通过cookie的方法:
setDomain(String path)
, 如果设置其一级域名相同(如news.baidu.com
和tieba.baidu.com
中的.baidu.com
为他们的一级域名,所以他们的cookie数据可以共享),那么多个服务器之间cookie信息就可以共享了.
- 通过cookie的方法:
-
cookie的特点和作用
-
特点
- cookie存储数据在客户端浏览器,没有存储在服务器那么安全.
- 浏览器对于单个cookie的大小由限制(4KB左右,据浏览器而定),以及对同一个域名下的总cookie数量也有限制.
-
作用
- cookie一般用于存储少量的不太敏感,不太重要的数据.
- 在不登录的情况下(登录之后我们的信息都是存储在数据库中)完成服务器对客户端的身份识别,例如我们对百度这个网页设置了不在首页显示天气,当我关闭浏览器下次再打开百度页面的时候,是不会显示天气的,这就是因为我们在设置了不显示天气以后,百度服务器就把这个设置用cookie对象响应给了浏览器并保存到硬盘中,下次我们再打开的时候,就是带着cookie数据打开的,此时该页面会自动读取我所带着的cookie中的数据并进行相应的设置.
-
-
-
cookie案例(记住上一次访问时间)
-
需求:
- 访问一个servlet,如果是第一次访问,则提示: 您好,欢迎您首次访问.
- 如果不是第一次访问,则提示: 欢迎回来,您上次的访问时间为: xxxxxxxxx.
-
分析:
- 可以采用cookie来完成.
- 在服务器中的servlet判断是否有一个名为time的cookie
- 有,说明不是第一次访问
- 提示: 欢迎回来,您上次的访问时间为: 2019/05/15 16:30:55.
- 写回cookie: time=2019/05/15 16:31:00.
- 没有,说明是第一次访问
- 没有就去响应数据: 您好,欢迎您首次访问.
- 写回cookie:time=2019/05/15 16:30:55.
- 有,说明不是第一次访问
- 记住上一次访问时间代码实现.
-
一点小问题
- 我由于自己不小心在设置response编码格式的时候,把
response.setContentType("text/html;charset=Unicode");
写成了response.setContentType("content-type:text/html;charset=Unicode");
,这样会导致什么问题呢?会导致直接把你要输出的内容下载下来,切记切记!.
- 我由于自己不小心在设置response编码格式的时候,把
-
JSP入门
-
概念: Java Server Pages 即java服务器端页面,可以理解为一个特殊的页面,其中既可以直接定义html标签,又可以定义java代码.
-
用于简化书写!!!
-
原理
- jsp本质上就是一个servlet,浏览器通过页面访问服务器的时候,服务器会将jsp转换为java文件,然后编译成.class字节码文件,最后通过字节码文件做出响应.
-
jsp脚本:jsp定义java代码的方式
- <% java代码 %>: 定义的java代码放在jsp文件转换为java文件后中的service方法中.该脚本中可以写所有在servlet的service方法中语句,在方法里面的输出语句是
out.print()
. - <%! java代码%>: 定义的java代码,在jsp转换为java类后的成员位置,可以是成员变量,也可以是成员方法,这种用的不多.
- <%= java代码%>: 这就相当于一个输出语句,输出语句中可以定义什么,该脚本中就可以定义什么,如果成员位置和局部位置都有同一个变量,会输出成员变量的值.
- <% java代码 %>: 定义的java代码放在jsp文件转换为java文件后中的service方法中.该脚本中可以写所有在servlet的service方法中语句,在方法里面的输出语句是
-
jsp内置对象: 指在jsp页面中不需要获取和创建就可以直接使用的对象,比如request对象,一共有9个内置对象,包括request,response,out(字符输出流对象,将数据输出到页面上和response.getWriter()类似)等,具体的后面再写.
- response.getWriter()和out.write()的区别: out对象定义在哪个位置就在哪个位置输出,而response.getWriter()对象不论定义在哪里,都会先于out对象输出,因为tomcat在给客户端做出响应前,会先找response缓冲区数据,再找out缓冲区数据.
- 我们用的时候尽量都要out就可以了.
Session(接口)
-
概念: 服务器会话技术,在**一次会话(表示session的范围)**的多次请求间共享数据,将数据保存在服务器端的对象中—HttpSession,session也是域对象.
- 什么是一次会话呢,就比如我现在有两个servlet,通过session共享数据,当我把浏览器关闭后,这次会话就结束了,再打开浏览器就是一个新的会话,如果此时访问获取数据的servlet就会报错,就说明session的作用范围是一次会话.
-
快速入门
- 获取session对象:
HttpSession session = request.getSession()
. - 使用session对象: 即HttpSession对象
Object getAttribute(String name)
.void setAttribute(String name,Object value)
.void removeAttribute(String name)
.- 域对象都有这几个方法…
- session快速入门发送数据代码.
- session快速入门接收数据代码.
- 获取session对象:
-
原理: session的实现是依赖于cookie的
- 当我们第一次请求,服务器创建了session对象后,只有本次会话没有结束,后面一直都不会再创建新的session对象了,也就是说,你没有关闭浏览器之前,虽然多次运行发送请求的servlet网址,响应头也不会再有带session的id的键值对了.
- 原理图: .
-
session的细节
-
当客户端关闭,服务器不关闭后,两次获取的session是否是同一个?
- 默认情况下,不是同一个.
- 那么我希望客户端关闭重新打开后后,session也能相同,而且可以直接获取session的数据,应该怎么做呢?
- 在获取session的servlet中创建一个cookie,键为
JSESSIONID
,值为session的id值,通过response的响应头set-cookie将其发送给浏览器,同时让cookie实现持久化存储.
Cookie cookie = new Cookie(“JSESSIONID”, session.getId());
cookie.setMaxAge(60*60);
response.addCookie(cookie);
- 在获取session的servlet中创建一个cookie,键为
-
客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
- 服务器关闭了,session对象就被销毁了,因为内存被释放了,所以说不是同一个.
- 因为对象不是同一个,所以说,原来的session对象中的数据我们是访问不到的,这就产生了数据丢失,这肯定是不希望看到的,所以这里需要提到两个点.
- session的钝化: 即在服务器正常关闭之前,将session对象序列化到硬盘上.
- session的活化: 即在服务器启动后,就session文件转化为内存中的session对象.
- 上面的两个功能tomcat已经为我们实现了,找到上述项目
编译后的保存位置
,放在tomcat保存目录
下的webapps
目录下,然后通过tomcat的lib目录
启动tomcat,可以正常访问servlet,然后通过tomcat的lib目录
正常关闭tomcat,我们会发现在tomcat的work目录会多一个session.ser的文件
,里面就保存着session的id,重新正常启动tomcat之后,那个文件就会自动被删除,我们再次读取session的值的时候,它会自动把session的id通过请求头传递给服务器,所以我们可以正常读取session中的值. - idea可以实现钝化,但是不可以实现活化的操作,重新启动服务器它会直接删除work目录然后新建一个,所以读取不到原session的数据.
-
session的失效时间,即session什么时候被销毁
- 服务器关闭,session被销毁.
- session对象调用invalidate()方法自己销毁自己.
- session默认失效时间为30分钟,可以在
apache-tomcat-9.0.19\conf\web.xml
中查看到.
-
-
session的特点:
- session用于存储一次会话的多次请求的数据,存储在服务器端.
- session可以存储任意类型,任意大小的数据.
-
session与cookie的区别
- session存储数据在服务器端,而cookie在客户端.
- session没有数据大小限制,而cookie有.
- session数据安全,cookie相对不安全.
- session可以存储任意类型的数据,而cookie只能存储string类型的,通过session.setAttribute()和新建cookie对象时可以知道.
案例:验证码
-
需求:
- 访问一个带有验证码的登录页面login.jsp.
- 用户输入用户名,密码以及验证码.
- 如果用户名和密码输入有误,跳转登录页面,提示: 用户名或密码错误.
- 如果验证码输入有误,跳转登录页面,提示: 验证码错误.
- 如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您!