会话技术 之 cookie _ session
1.什么是会话 ?
答 : 指用户开启浏览器,访问一个网站,只要不关闭浏览器 , 不管客户开了多少链接,访问多少资源,直到用户关闭浏览器, 这整个流程就称为一次会话.
2.为什么我们要使用会话技术?
why? 会话跟踪技术,主要是可以帮我解决很多小问题 , 像有时候 ,在访问一些网站的时候 ,会弹出是否要记住密码 , 这样下次就可以自动登录了.
会话跟踪技术有 cookie , session.
接下来 , 我就带你们走进 它们的世界 . .
首先 我们应该知道 , 网页之间的交互是通过 HTTP协议传输数据的, 但是呢 , HTTP是无状态协议 .
啥是无状态协议 ? ? ? --->>>答 : 就是 一旦数据提交完后 , 浏览器和服务器的连接就会关闭 , 再次交互的时候需要重新建立连接.
这样的话 , 服务器就无法确认用户的信息 ,于是呢 , w3c就提出了 : 给每一个用户都发一个通行证,无论谁访问的时候都需要携带通行证,这样服务器就可以从通行证上确认用户的信息。通行证就是Cookie.
3.Cookie流程
Cookie 的 流程 :
浏览器访问服务器,如果服务器需要记录该用户的状态, 就是使用response向浏览器发送一个Cookie,浏览器就会把Cookie保存起来.当浏览器再次访问服务器的时候 ,浏览器会把请求的网址连同Cookie一起交给服务器 .
Cookie :
1.概念 : 客户端会话技术 , 将数据保存到客户端 .
2.Cookie的基本使用:
简单三步骤 : 1.创建Cookie对象 ; 2.发送Cookie ; 3.获取浏览器带过来的Cookie.
cookie 基本使用 :
1&2:
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求编码
req.setCharacterEncoding("utf-8");
//获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//2.模拟和数据中的账号信息是否一致
if("admin".equals(username)&&"1".equals(password)){
//存放到cookie 中
//1. 创建 Cookie 2.发送coolkie
Cookie c = new Cookie("username", username);
resp.addCookie(c);
req.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(req,resp);
return;
}else{
System.out.println("登陆失败!");
}
}
3.1 从Cookie中获取数据(servlet中)
Cookie cs[]=req.getCookies();
for(Cookie c:cs){
if("username".equals(c.getName())){
username=c.getValue();
}
}
3.2 从Cookie中获取数据(jsp中)
EL内置对象 :
${cookie.username.value}
4.Cookie 细节使用
4.1 修改Cookie中的数据
为Cookie重新设置数据(2方式):
1.调用cookie的 setValue()方法覆盖原来的数据;
2.创建一个name一样的Cookie对象
这里要注意 : 修改后 要 resp.addCookie(新的cookie对象)
4.2设置cookie的存活时间
注: 默认情况下 , cookie是属于会话cookie , 即浏览器关闭则失效 , 无法使用 .
要设置存活时间 :
创建cookie后 , 就设置存活时间
api: Cookie对象的 setMaxAge(int expiry)
expiry>0 例 expiry(60) 即 60秒
=0 则是 立即删除Cookie对象
<0 则是会话关闭 , Cookie对象销毁
4.3 Cookie中文问题
Tomcat 8.5 以上自动处理了这个问题 , 所以无需手动解决了 .
不是 Tomcat 8.5 以上的 , 百度下即可 .
4.4 Cookie的特点和作用
特点:
1. cookie存储数据在客户端浏览器
2. 浏览器对于单个cookie 的大小有限制(4 k b ) 以及 对同一个域名下的总cookie数量也有限制(20个)
作用:
1. cookie一般用于存出少量的不太敏感的数据
2.在不登录的情况下,完成服务器对客户端的身份识别
5.session
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中.
-
快速入门:
2.1. 获取HttpSession对象:
HttpSession session = request.getSession();
2.2.使用HttpSession对象:
Object getAttribute(String name) ---(String 强转 今天用到的)
void setAttribute(String name, Object value)
void removeAttribute(String name)
@WebServlet("/session/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理请求编码
req.setCharacterEncoding("utf-8");
//获取请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//2.模拟和数据中的账号信息是否一致
if("admin".equals(username)&&"1".equals(password)){
req.getSession().setAttribute("USER_IN_USERNAME",username);//------看这里------
req.getRequestDispatcher("/WEB-INF/view/index.jsp").forward(req,resp);
return;
}else{
System.out.println("登陆失败!");
req.getRequestDispatcher("/WEB-INF/view/login.jsp").forward(req,resp);
}
}
}
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>邮件列表页</title>
</head>
<body> <!--看这里********看这里*******看这里**************看这里**************************-->
欢迎 : ${USER_IN_USERNAME} 先生/女士<br>
<c:forEach items="${list}" var="email">
<a href="/session/content">${email}</a><br>
</c:forEach>
</body>
</html>
3.原理 : Session的实现是依赖于Cookie的。
- 当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
默认情况下。不是。
如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);
- 客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
session的钝化:
在服务器正常关闭之前,将session对象系列化到硬盘上
session的活化:
在服务器启动后,将session文件转化为内存中的session对象即可。
- session什么时候被销毁?
4.1.服务器关闭
4.2. session对象调用invalidate() 。
4.3. session默认失效时间 30分钟
4.4选择性配置修改
<session-config>
<session-timeout>30</session-timeout>
</session-config>
-
session的特点
session用于存储一次会话的多次请求的数据,存在服务器端
session可以存储任意类型,任意大小的数据
session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全