回话技术
- 会话:浏览器和服务器之间的多次请求和响应。
- 为了实现一些功能 ,浏览器和服务器之间可能会产生多次的请求和响应,从浏览器访问服务器开始,到访问服务器结束(关闭浏览器、到了过期时间)。这期间产生的多次请求和响应加在一起就称之为浏览器和服务器之间的一次会话。
会话过程中所产生的一些数据,可以通过会话技术( Cookie和Session )保存。
Cookie
-
Cookie :客户端会话管理技术
- 把要共享的数据保存到客户端。
- 每次请求时,把会话信息带到服务器端,从而实现多次请求的数据共享!
-
作用:可以保存客户端访问网站的相关内容,从而保证每次访问时先从本地缓存中获取,以此提高效率!
Cookie其实是一个普通的Java类,可以直自己去创建对象,相对于我们之前自己定义的那些Student、Teacher这些类
包含的核心组成:一个是name(名称),一个是value(属性值),
发送Cookie使用请求对象调用addCookie()这个方法进行发送,
获取是借助与请求对象调用getCookie()这个方法进行获取,
Cookie有大小和个数限制,每个网站最多存20个Cookie,所以网站加起来最多只能存300个Cookie,每个Cookie的大小不能超过4kb
浏览器把Cookie带回服务器端,利用的是HTTP协议中请求消息头,可以通过请求对象的getCookies方法,获取当前网站中的全部Cookie,几个Cookie可能具有相同的名称,但是路径属性不同,即确定唯一的Cookie不能只用名称
Cookie属性
Cookie方法
构造方法
name是final修饰的,不能被更改,所以name只有get方法
添加获取方法
Cookie使用案例
- 需求说明
- 通过Cookie记录最后访问时间,并在浏览器上显示出来。
- 最终目的
- 掌握Cookie的基本使用,从创建到添加喀户端,再到从服务器端获取。
- 实现步骤
- 1.通过响应对象写出一个提示信息。
- 2.创建Cookie对象,指定name和value。
- 3.设置Cookie最大存活时间。
- 4.通过响应对象将Cookie对象添加到客户端。
- 5.通过请求对象获取Cookie对象。
- 6.将Cookie对象中的访问时间写出。
@WebServlet("/cookieUse")
public class CookieUse extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.通过响应对象写出提示信息
resp.setContentType("text/html;charset=UTF-8");
PrintWriter pw = resp.getWriter();
pw.write("欢迎访问,你最近的访问时间为:<br>");
//2.创建Cookie对象,用于记录最后访问时间
Cookie cookie = new Cookie("time", System.currentTimeMillis() + "");
//3.设置最大存活时间
cookie.setMaxAge(3600);//如果不去设置的话,默认是-1,负整数:表示只是当前回话有效
//4. 将cookie对象添加到客户端
resp.addCookie(cookie);
//5. 获取cookie
Cookie[] arr = req.getCookies();
for(Cookie c : arr){
if ("time".equals(c.getName())){
//获取cookie对象的value,进行写出
String value = c.getValue();
//对输出数据进行格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
pw.write(sdf.format(new Date(Long.parseLong(value))));
}
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
/*
欢迎访问,你最近的访问时间为:
2021-08-30 08:40:38
*/
Cookie细节
- 数量限制
- 每个网站最多只能有20个Cookie ,且大小不能超过4KB。所有网站的Cookie总数不能超过300个。
- 名称限制
- Cookie的名称只能包含ASCCI码表中的字母、数字字符。不能包含逗号、分号、空格,不能以$开头。
- Cookie的值不支持中文。
- 存活时间限制setMaxAge(方法接收数字
- 负整数:当前会话有效,浏览器关闭则清除。
- 0 :立即清除。
- 正整数:以秒为单位设置存活时间。
- 访问路径限制
- 默认路径:取自第一-次访问的资源路径前缀。只要以这个路径开头就能访问到。
- 设置路径: setPath(方法设置指定路径。
Session
Session代表的是回话域对象的统称,实际要使用的是HttpSession
HttpSession
-
他实际上是一个接口,在我们使用时,会由服务器来提供实现类,只需要获取实现类对象使用即可
-
HttpSession :服务器端会话管理技术。
- 本质也是采用客户端会话管理技术。
- 只不过在客户端保存的是一个特殊标识,而共享的数据保存到了服务器端的内存对象(HttpSession对象)中。
- 每次请求时,会将特殊标识带到服务器端,根据这个标识来找到对应的内存空间,从而实现数据共享!
- 是Servlet规范中四大域对象之一的会话域对象。
-
作用:可以实现数据共享
-
域对象
HttpSession方法
常用方法
获取方法
getSession()方法里面传一个Boolean类型的参数,参数默认值是true,true意思就是说如果没有找到这个实现类对象,它会帮我们去创建出这样的一个新的对象出来,指定为false的话,如果找不到它也不会帮我们去创建了
客户端浏览器去访相应的资源的时候,比如调用getSession()方法,调用这个方法是,服务器会查看是否携带JSESSIONID的值(特殊的标识),
带了的话,比如该值是001,查看该值。。有的话,代表了服务器内存空间里面有一个对应的实现类对象,其标识就是001,有的话就能够拿到这个实现类对象进行使用
没有的话,分配完id后会在服务器内存空间里面创建出来一个实现类对象,而且会分配一个唯一的标识
没有携带的话,会创建实现类对象,并会分配一个唯一的标识个服务器内存空间,最后再把中国唯一标识发送给客户端
HttpSession的使用
- 需求说明
- 通过第一个Servlet设置共享数据用户名,在第二个Servlet获取到。
- 最终目的
- 掌握HttpSession的基本使用,如何获取和使用。
- 实现步骤
- 1.在第一个Servlet中获取请求的用户名。
- 2.获取HttpSession对象。
- 3.将用户名设置到共享数据中。
- 4.在第个 Servlet 中获取HttpSession 对象。
- 5.获取共享数据用户名。
- 6.将获取到用户名响应给客户端浏览器。
储存数据
@WebServlet("/Session1")
public class SessonDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取请求的用户名
String username = req.getParameter("username");
//2.获取Ht tpSession的对象
HttpSession session = req.getSession();
//3.将用户名信息添加到共享数据中
session.setAttribute("username",username);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
获取数据
@WebServlet("/Session2")
public class SessonDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取Ht tpSession对象
HttpSession session = req.getSession();
//2.获取共享数据
Object username = session.getAttribute("username");
//3.将数据响应给浏览器
resp.getWriter().write(username+"");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
HttpSession细节
-
浏览器禁止使用Session
- 方式一:通过提示信息告知用户,大部分网站采用的解决方式。(推荐
- 方式二:访问时拼接jsessionid标识,过encodeURLO方法重写地址。(了 解)
-
钝化和活化
- 什么是钝化和活化
- 钝化:列化。把长时间不用,但还不到过期时间的HttpSession进行序列化,写到磁盘上。
- 活化:相反的状态。
- 何时钝化
- 第一种情况:当访问量很大时,服务器会根据getL astAccess Time来进行排序,对长时间不用,但是还没到过期时间的HttpSession进行序列化。
- 第二种情况:当服务器进行重启的时候,为了保持客户HttpSession中的数据,也要对其进行序列化。
- 注意
- HttpSession的序列化由服务器自动完成,我们无需关心。
- 什么是钝化和活化
Session和Cookie补充
session什么时候被销毁?
- 服务器关闭
- session对象调用invalidate() 。
- session默认失效时间 30分钟
修改session存活时间
- 1.在工程的web.xml中设置
默认session超时时间为30分钟,可以根据需要修改,负数或0为不限制session失效时间。
<session-config>
<!-- 设置30分钟-->
<session-timeout>30</session-timeout>
</session-config>
- 通过Java代码设置
request.getSession().setMaxInactiveInterval(4*60);//设置存活时间为60
session的特点
- session用于存储一次会话的多次请求的数据,存在服务器端
- session可以存储任意类型,任意大小的数据
Cookie的特点和作用
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
- 作用:
- cookie一般用于存出少量的不太敏感的数据
- 在不登录的情况下,完成服务器对客户端的身份识别
session与Cookie的区别
- session存储数据在服务器端,Cookie在客户端
- session没有数据大小限制,Cookie有
- session数据安全,Cookie相对于不安全