Cooike与Session
Cooike与Session:
HTTP是一个无状态的协议,当一个客户端向服务端发送请求,在服务器返回响应后,连接就关闭了,在服务器端不保留连接信息。
思考:当客户端发送多次请求且需要相同的请求参数的时候,应该如何处理?
概念:
Cookie是一种在客户端保持HTTP状态信息的技术
Cookie是在浏览器访问服务器的某个资源时,由web服务器在响应头传送给浏览器的数据
浏览器如果保存了某个cookie,那么以后每次访问服务器的时候,都会在请求头传递给服务端
一个cookie只能记录一种信息,是key-value形式
一个web站点可以给浏览器发送多个cookie,一个浏览器也可以存储多个站点的cookie
服务端指控浏览器保存哪些数据,浏览器就保存哪些数据。
代码:
package com.wp.controller;/*
*@author wupeng
*@time 2021/6/22-10:05
Cookie:用来处理客户端发送不同请求的时候如何使用相同的参数信息
特点:
1.Cookie是保存在浏览器端的数据名称
2.Cookie分类:临时cookie:默认存储在内存中,浏览器关闭的时候,Cookie自动失效
持久化Cookie,保存在浏览器的某个存储目录,当时间过期之后,才会失效
3.每一个cookie对象中保存一个key-value键值对的数据,想要存储多个kv键值对,需要存储多个cookie对象
*/
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/cookie")
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("gbk");
req.getParameter("name");
// 创建cookie对象
Cookie cookie1 = new Cookie("00001","beijing");
//将Cookie保存到浏览器中
resp.addCookie(cookie1);
//getCookie对象添加事件有效期,单位是秒
cookie1.setMaxAge(3*24*3600);
Cookie cookie2 = new Cookie("00002","shanghai");
resp.addCookie(cookie2);
//给Cookie设置固定路径值,设置某个cookie与某个请求路径有关
cookie1.setPath("/cookie/abc");
resp.getWriter().write("学习cookie");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
获取Cookie对象:
package com.wp.controller;/*
*@author wupeng
*@time 2021/6/22-10:35
*/
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/getcookie")
public class GetCookieServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("gbk");
//获取Cookie对象
Cookie[] cookies = req.getCookies();
if(cookies.length > 0) {
for(Cookie c : cookies) {
String key = c.getName();
String value = c.getValue();
System.out.println(key+":"+value);
}
}
}
}
实现免密登录:
1、用户发送验证cookie信息的请求,编写对应的servlet进行处理
2、如果包含cookie,直接跳转到成功页面
3、如果不包含cookie信息,直接跳转到登录页面
Session:
一个用户的不同请求的处理需要使用相同的数据怎么办
表示的是一种服务器端储存数据的技术
概念:
- Session表示会话,在一段时间内,用户与服务器之间的一系列的交互操作
- session对象:用户发送不同请求的时候,在服务器端保存不同请求共享数
据的存储对象
- session对象:用户发送不同请求的时候,在服务器端保存不同请求共享数
- 特点:
- Session是依赖sessoin技术的服务器端的数据存储技术
- 由服务器进行创建
- 每个用户独立拥有一个session对象
- 默认存储时间是30分钟
Session机制:
用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的Servlet进行处理。在处理过程中会给用户创建一个session对象,用来存储用户请求
处理相关的公共数据,并将此session对象的JSESSIONID 以sessoin的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,
请求信息中会附带JSESSIONID,服务器在接收到请求后,调用对应的Servlet进行请求处理,同时根据JSESSIONID返回其对应的session对象
代码:
package com.wp.controller;/*
*@author wupeng
*@time 2021/6/22-20:38
*/
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/*
session:
作用:
解决相同用户发送不用请求时的数据共享问题
特点:
1.服务器端存储共享数据的技术
2.session需要依赖cookie技术
3.每个用户对应一个独立的session对象
4.每个用户session对象的有效时常是30分钟
5.每次关闭浏览器的时候,重新请求都会开启一个新的session对象,因为返回JSeesion保存在浏览器的内存中,是临时cookie,所以关闭之后自然消失
使用:
创建sessoin对象
HttpSession session = request.getSession()
向Session对象中添加值
sessoin.setAttribute(String name,Object object)
获取Session中的值
session.getAttribute(String name)
设置sessoin属性
session.setMaxInactiveInterval(5)//设置存活时间
session.invalidate(); //session强制失效
*/
@WebServlet("/session")
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("接受到请求get");
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("gbk");
//如果上面设置编码不生效的话
resp.setContentType("text/html:charset=utf-8");
//获取Session对象
HttpSession session = req.getSession();
//设置session的有效时常
session.setMaxInactiveInterval(5);
//设置session强制失效
//getid拿到JSessionid
System.out.println(session.getId());
resp.getWriter().write("Session");
//5秒之后重新生成一个新的Session对象
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}