一、会话技术概述
(一)什么是会话技术
类似两个人谈话,会话其实就是服务器和客户端的多次请求和响应
一次会话:多次请求和响应 组成了一次会话。从第一次发送请求建立会话,直到一端断开连接
http协议:无状态的协议,指的就是不能保存上一次请求和响应的数据,实现客户端和服务器端数据保存共享
依赖于会话技术
(二)会话技术分类:
客户端会话技术: cookie
少量数据保存在客户端浏览器上
优点 :方便(减轻了服务器压力)
缺点 :数据不安全
服务器端会话技术:session
数据保存在服务器上
优点: 数据安全
缺点:服务器压力大
二、cookie
以逛商场为例理解:
第一次去商场 ----
买东西
---
办
vip
卡 (姓名 电话
积分)
----
给我 ,第二次再去商场的时候
自己主动携带
vip
卡。
cookie 实现数据共享原理,类似我们的
vip
卡, 第一次请求的时候不会有
vip
卡(
cookie
),请求结束,服务器给我响应的时候 会给我vip
卡(
cookie
), 下一次去访问服务器的时候,客户会自
带
vip
卡(
cookie
)。
客户端会话技术原理:
通过响应头 set-cookie
和请求头
cookie
来完成的
Cookie
数据共享实现原理:
第一次访问服务器的时候,请求头没cookie
,但是响应的时候会有一个
set-cookie
的响应头,这个响应头里携带的就是我需要共享的数据,第二次再去请求服务器的时候,会携带一个请求头cookie里的值就是共享数据。
cookie重要属性:
Name: cookie名称,但不作唯一标识
Value:
cookie
存储的值,不建议存中文
cookie 细节:
cookie
设置保存时间
默认保存时间是多久
setMaxAge() 方法
是设置
cookie
的存活时间
单位秒
正数:cookie
将会持久化储存再硬盘上,并保存相应的时间
给0
马上删除
默认值是-1
代表关闭浏览器或服务器清除
三、cookie小结
1:一个
cookie
可以标识一种数据
2:一个浏览器对一个站点可以存储
20
个
cookie ,
总共能存储
300
个
cookie
3:cookie 大小在
4kb
以内
案例:cookie 实现记住用户名密码
package com.day06;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
//接受前端数据
String username = request.getParameter("username");
String psd = request.getParameter("psd");
//校验信息是否正确
if ("aaa".equals(username) && "123".equals(psd)){
String rember = request.getParameter("rember");
//判断记住密码是否勾选
if (rember != null){
//创建cookie
Cookie cookie = new Cookie("uName",username);
Cookie cookie1 = new Cookie("pWord",psd);
//设置存活时间
cookie.setMaxAge(60*60);
cookie1.setMaxAge(60*60);
//发送cookie
response.addCookie(cookie);
response.addCookie(cookie1);
}
//信息正确跳转到成功页面
request.setAttribute("uname",username);
request.getRequestDispatcher("success.jsp").forward(request,response);
}else {
//信息错误跳转到登陆界面,并友好提示
request.setAttribute("msg","用户名或密码输入错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
login.jsp页面
<%--
Created by IntelliJ IDEA.
User: 86182
Date: 2023-5-17
Time: 10:47
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%
String cValue = "";
String cValue1 = "";
//获取cookie
Cookie[] cookies = request.getCookies();
//非空判断
if (cookies != null){
//循环遍历cookies数组
for (Cookie c : cookies) {
//获取cookie的name属性
String cName = c.getName();
//因为会拿到所有的name,所以做个判断,只拿到需要的name
if ("uName".equals(cName)){
//获取值
cValue = c.getValue();
System.out.println(cValue);
}
if ("pWord".equals(cName)){
//获取值
cValue1 = c.getValue();
System.out.println(cValue1);
break;
}
}
}
%>
<form action="${pageContext.request.contextPath}/loginServlet" method="post">
用户名<input type="text" name="username" value=<%=cValue%>><br>
密码<input type="password" name="psd" value=<%=cValue1%>><br>
<input type="checkbox" name="rember" value="111" checked>记住密码
<input type="submit" value="登录">
<a href="zhuce.jsp">注册</a>
</form>
${msg}
</body>
</html>
四、session 会话
Session概念
:
在web
开发中
,
我们服务器可以为每一个浏览器创建一个会话对象
(session),
一个浏览器默认独占一个session对象的
,
因此保存用户数据的时候
,
可以将用户信息写在
session
中
Session
依赖于
cookie
(一)cookie 和session区别
1:
cookie
是把少量数据保存在浏览器上
2:
session
技术是把用户数据写入用户独占的
session
对象中,存在服务器中
3:
session
对象是属于服务器的,获取
session
的方式是
request.getSession()
(二)session实现数据共享原理
1:服务器创建一个
web
浏览器的
session
对象 并保存
2:session对象有唯一且非空的
id
用于区别
3:第一次请求服务器的时候请求头没东西但是会有一个响应头
(set-cookie)
内容是
session
的
id
4:浏览器会把
sessionid
信息保存在
cookie
中
5:新的请求会携带一个请求头
coookie
内容是
sessionid
服务器会话技术(Session
) 将数据存储再服务器端
优点: 数据安全
缺点:不方便 服务器压力大
(三)session细节
1:如果浏览器关闭了
,session
对象还是同一个吗?
不是 浏览器关闭了,
内存释放了
, cookie
也就销毁了
所以
cookie
里的
sessionid
就没了
2:关闭服务器
,
浏览器不关闭
.session
对象是同一个吗
?
session的钝化
:
就是当服务器正常关闭的时候
,
会将
session
对象写到硬盘里
session的活化
:
当服务器再次开启的时候会将文件
,
还原成
session
对象
3:session的销毁
(1)服务器关闭 session
销毁
(2)session超时:
默认时间
30
分钟(在web.xml里修改)
<session-config>
<session-timeout>60</session-timeout>
</session-config>
(3)session 自杀:安全退出
案例:Session实现购物车
package com.day06;
import com.day06.pojo.Book;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
@WebServlet("/shoppingServlet")
public class ShoppingServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//接收前端数据
String bookName = request.getParameter("bookName");
String bookPrice = request.getParameter("bookPrice");
//把bookName封装成Book对象
Book book = new Book(bookName,bookPrice);
//创建session
HttpSession session = request.getSession();
//获取session里的books集合
ArrayList<Book> list =(ArrayList<Book>) session.getAttribute("books");
//判断list集合是否为空
if (list == null){
//为空,则是第一次请求
//创建集合 把得到的book对象封装起来
ArrayList<Book> list1 = new ArrayList<>();
list1.add(book);
session.setAttribute("books",list1);
}else {
//不为空,则不是第一次请求,把book存入集合
list.add(book);
session.setAttribute("books",list);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
book.jsp页面
<%--
Created by IntelliJ IDEA.
User: 86182
Date: 2023-5-17
Time: 15:44
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>书本展示</title>
</head>
<body>
<a href="${pageContext.request.contextPath}/shoppingServlet?bookName=西游记&bookPrice=34.98">西游记</a>
<a href="${pageContext.request.contextPath}/shoppingServlet?bookName=水浒传&bookPrice=45.22">水浒传</a>
<a href="${pageContext.request.contextPath}/shoppingServlet?bookName=红楼梦&bookPrice=43.54">红楼梦</a>
<a href="${pageContext.request.contextPath}/shoppingServlet?bookName=三国演义&bookPrice=53.34">三国演义</a>
<a href="${pageContext.request.contextPath}/bookList.jsp">加入购物车</a>
</body>
</html>
bookList.jsp页面
<%--
Created by IntelliJ IDEA.
User: 86182
Date: 2023-5-17
Time: 15:49
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<title>购物车</title>
</head>
<body>
<table>
<tr>
<th>编号</th>
<th>书名</th>
<th>价格</th>
</tr>
<c:forEach items="${books}" var="book" varStatus="s">
<tr>
<td>${s.count}</td>
<td>${book.bookName}</td>
<td>${book.bookPrice}</td>
</tr>
</c:forEach>
</body>
</html>