一、会话技术
1、概念
- 会话:一次会话包含多次请求和响应。
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。
2、功能
- 用于在多次请求之间跟踪和管理用户状态,实现数据连续性、数据共享和个性化等功能。
3、方式
(1)客户端会话技术:Cookie
(2)服务器端会话技术:Session
二、Cookie
1、概念
客户端会话技术,将数据保存到客户端。
2、使用步骤
(1)创建Cookie对象,绑定数据。
(2)发送Cookie对象。
方法:response.addcookie(cookie cookie)
(3)获取Cookie,拿到数据。
方法:request.getCookies()
- 代码示例:
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
Cookie cookie = new Cookie("mag", "hello");
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
}
@WebServlet(name = "CookieDemo2", value = "/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
String name=c.getName();
String value = c.getValue();
System.out.println(name+"---"+value);
/*结果:
JSESSIONID---FE9F2F56729D63A4899A588AFB3CA8C3
mag---hello
Idea-5574819d---8e64ae8b-0a15-4a40-bc2f-13c605f4080e*/
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
3、实现原理
- 客户端发送请求
- 当服务器接收到请求后,它可以生成一个唯一的标识符,也就是 Cookie,服务器通过 Set-Cookie 头部发送一个或多个 Cookie 给客户端。
- 一旦客户端收到服务器发送的 Cookie,它会将 Cookie 存储在客户端的内存或者硬盘上,通常是以文本文件的形式保存。
- 客户端向服务器发送请求时,浏览器会自动在请求头中携带相应的 Cookie 数据。这样,服务器就能够根据特定的 Cookie 来识别和关联来自同一用户的多个请求。
- 服务器在接收到请求后,可以读取请求头中携带的 Cookie 数据。它可以解析和验证这些 Cookie,并根据其中的信息来获取用户的状态和个性化数据。
4、Cookie细节
(1)一次可不可以发出多个Cookie?
答:可以
方法:可以创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
- 代码演示:
@WebServlet("/CookieDemo3")
public class CookieDemo3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie1 = new Cookie("msg", "hello");
Cookie cookie2 = new Cookie("name", "zhangsan");
response.addCookie(cookie1);
response.addCookie(cookie2);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
@WebServlet(name = "CookieDemo2", value = "/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for(Cookie c:cookies){
String name=c.getName();
String value = c.getValue();
System.out.println(name+"---"+value);
/* 结果:
JSESSIONID---1F470E5E0D3E38C905A7754DC3E15A46
msg---hello
name---zhangsan
Idea-5574819d---8e64ae8b-0a15-4a40-bc2f-13c605f4080e*/
}
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
(2)cookie可以在浏览器中保存多长时间?
①默认情况下,浏览器关闭,cookie数据被销毁
②持久化存储:方法:setMaxAge(int seconds)
- 正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效。
- 负数:默认情况
- 0:删除cookie信息
- 代码演示:
@WebServlet("/CookieDemo3")
public class CookieDemo4 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("msg", "hello");
//cookie.setMaxAge(30);//30秒后销毁cookie
//cookie.setMaxAge(-1);
cookie.setMaxAge(0);
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
5、cookie的共享
(1)同一个tomcat服务器中,多个web项目,默认情况下这些web项目中cookie是不可共享的。
若要共享:使用setpath(String path)方法设置cookie的取值范围
默认情况下,设置的是当前虚拟目录,如果要多个项目共享,则可以将path设置为"/"。
代码示例:
@WebServlet("/CookieDemo5")
public class CookieDemo5 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("msg", "hello");
cookie.setPath("/");
response.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
(2) 不同的tomcat服务器间cookie共享
设置一级域名相同,那么多个服务器之间cookie可以共享。
方法:setDomain(String path)
6、cookie的作用与特点
(1) cookie存储数据在客户端浏览器
(2) 浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)
作用:
(1) cookie一般用于存出少量的不太敏感的数据
(2) 在不登录的情况下,完成服务器对客户端的身份识别
三、JSP简单了解
1、概念
JSP(Java Server Pages):Java服务器端页面,是一种用于在服务器端生成动态网页的技术。它结合了静态的 HTML 页面和 Java 代码,以便在服务器上生成动态内容,并将其发送给客户端浏览器。
2、原理
JSP本质上就是一个Servlet。
- 工作原理:
3、JSP脚本
JSP定义Java代码的方式有三种:
(1) <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
(2)<%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
(3)<%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。
4、JSP内置对象
(1)JSP内置对象在jsp页面中不需要获取和创建,可以直接使用。
(2) jsp内置对象有9个(我们今天先介绍3个):
① request:
②response:
③ out:字符输出流对象,可以将数据输出到页面上。和response.getWriter()类似
* response.getWriter()和out.write()的区别:
在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。所有·response.getWriter()数据输出永远在out.write()之前
四、Session
1、概念
Session:客户端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中(HttpSession)。
2、方法
(1)获取HttpSession对象:
request.getSession();
(2)使用HttpSession对象:
getAttribute(String name)
setAttribute(String name, Object value)
removeAttribute(String name)
- 代码示例:
@WebServlet("/Session1")
public class Session1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession session = request.getSession();
session.setAttribute("msg","hello");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
@WebServlet("/Session2")
public class Session2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession session = request.getSession();
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
3、原理
Session的实现依赖于cookie。
- 原理图:
4、细节
(1)当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
答: 默认情况下不是。
若需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。 Cookie c = new Cookie("JSESSIONID",session.getId());
代码示例:
@WebServlet("/Session3")
public class Session3 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取session
HttpSession session = request.getSession();
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request,response);
}
}
(2)客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
答:不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作 :
session的钝化:在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象即可。
(3) session什么时候被销毁?
①服务器关闭
② session对象调用invalidate() 。
③session默认失效时间 30分钟。
可在tomcat安装文件中选择web.xml进行配置:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
5、特点
(1) session用于存储一次会话的多次请求的数据,存在服务器端
(2)session可以存储任意类型,任意大小的数据
(3)session与Cookie的区别:
①session存储数据在服务器端,Cookie在客户端
② session没有数据大小限制,Cookie有
③ session数据安全,Cookie相对于不安全