会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
cookie
cookie是什么
-
cookie是在浏览器中保存的
-
如果想要使用cookie要保证我们的浏览器是开启cookie,所以说有一定的弊端,如果浏览器没有开启cookie,就不能再使用cookie了
-
cookie的大小是有限制的,通常是4096byte
-
cookie的保存是以键值对的形式存在的
cookie的常用方法
//1.cookie的构造方法,目的是实例化出来cookie对象
Cookie(String name,String value)
//2.设置cookie的方法
setValue(String value) //修改cookie的值
getValue(String value) //获得cookie的值
getName(String value) //获得cookie的键
setMaxAge(int time) //设置cookie的有效时间
//3.要将cookie发送到浏览器
response.addCookie(Cookie cookie);
//4.获得所有cookie
request.getCookies();
实例
SetCookieServlet类
public class SetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
/**
* 1.创建cookie对象
* 将键:java2311 值:sb ,存到cookie对象中
*/
Cookie cookie = new Cookie("msg", "sb");
/**
* 2.设置有效时间
* 正数:表示当前cookie的有效时间
* 负数:表示当前浏览器打开的时候存在,关闭的时候没了
* 0:销毁当前的cookie
*/
cookie.setMaxAge(60*60*24);//设置了有效期是个正数,
//3.把cookie发送到浏览器
resp.addCookie(cookie);
}
}
web.xml
<servlet>
<servlet-name>setCookieServlet</servlet-name>
<servlet-class>com.by.servlet.SetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>setCookieServlet</servlet-name>
<url-pattern>/setCookieServlet</url-pattern>
</servlet-mapping>
结果

GetCookieServlet类
public class GetCookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获取浏览器中cookie,返回值是一个数组
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println("==============");
System.out.println(cookie.getName());//获取键
System.out.println(cookie.getValue());//获取值
}
}
}
web.xml
<servlet>
<servlet-name>getCookieServlet</servlet-name>
<servlet-class>com.by.servlet.GetCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getCookieServlet</servlet-name>
<url-pattern>/getCookieServlet</url-pattern>
</servlet-mapping>
结果

DestroyCookieServlet类
public class DestroyCookieServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
//退出登录
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
if (cookie.getName().equals("msg")){
cookie.setMaxAge(0);//销毁cookie
//重新发送给浏览器
response.addCookie(cookie);
}
}
}
}
web.xml
<servlet>
<servlet-name>destroyCookie</servlet-name>
<servlet-class>com.by.servlet.DestroyCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>destroyCookie</servlet-name>
<url-pattern>/destroyCookie</url-pattern>
</servlet-mapping>
结果

cookie总结
1)是什么
保存在浏览器的一块存储区域
2)特点
②键值对
③可以禁用cookie
④最多存4096byte
⑤可设置过期时间
session
为什么使用session?
-
cookie保存数据类型是单一的,只能保存字符串类型的数据
-
cookie的大小有限制
session是什么?
保存服务器中
当用户发送一个HTTP请求到服务器时,服务器会检查该请求是否包含session标识符(通常是存cookie),如果没有,则会创建一个新的session(存储区域),并将session标识符发送给客户端。浏览器再发送请求时会携带session标识符,此时服务器根据session标识符就可以找到对应的session(存储区域)
使用session的时候一般要开启cookie如果浏览器没有开启cookie功能,我们可以通过html的url传参完后session的使用
没有大小的限制
信息的保存也是以键值对的形式存在的

session的常用方法
request.getSession(true); //返回HttpSession
setAttribute(key,value); //设置属性 key ,value
getAttribute(key); //获取key的值
removeAttribute(String key) //通过key值删除数据
invalidate(); //将session中的变量全部清空
setMaxInactiveInterval(int interval); //设置session失效时间,单位为秒
getMaxInactiveInterval();//获取session失效时间
getId(); //获取sessionID
实例
SetSessionServlet类
public class SetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得session
HttpSession httpSession = req.getSession();
//获得sessionid
String sessionId = httpSession.getId();
System.out.println("sessionId:" + sessionId);
User user = new User();
user.setUsername("张5丰");
user.setBirthday(new Date());
user.setSex("1");
//往session中添加属性
httpSession.setAttribute("user", user);
//设置session的失效时间
httpSession.setMaxInactiveInterval(60*5);
}
}
web.xml
<servlet>
<servlet-name>setSessionServlet</servlet-name>
<servlet-class>com.by.servlet.SetSessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>setSessionServlet</servlet-name>
<url-pattern>/setSessionServlet</url-pattern>
</servlet-mapping>
结果

GetSessionServlet类
public class GetSessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得session
HttpSession httpSession = req.getSession();
//获得session中的属性
User user = (User) httpSession.getAttribute("user");
System.out.println(user);
}
}
web.xml
<servlet>
<servlet-name>getSession</servlet-name>
<servlet-class>com.by.servlet.GetSessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>getSession</servlet-name>
<url-pattern>/getSession</url-pattern>
</servlet-mapping>
结果

DestroySessionServlet类
public class DestroySessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得session
HttpSession httpSession = req.getSession();
//session失效
httpSession.invalidate();
}
}
web.xml
<servlet>
<servlet-name>destorySession</servlet-name>
<servlet-class>com.by.servlet.DestroySessionServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>destorySession</servlet-name>
<url-pattern>/destorySession</url-pattern>
</servlet-mapping>
结果

session总结
1)是什么
是一个域对象,保存在服务器
2)特点
①键值对
②可设置过期时间
③失效:过期或关闭浏览器
Cookies和Sessions的区别和联系
Cookies和Sessions是Web开发中常用的两种技术,用于在客户端和服务器之间保持状态信息。它们之间的主要区别如下:
-
Cookies(Cookie):
- 存储位置:Cookies存储在客户端(用户的浏览器)中,以文本文件的形式存在。
- 容量限制:每个Cookie的大小通常受到限制,通常为4KB。
- 持久性:Cookies可以设置过期时间,可以是会话级的(浏览器关闭后失效)或持久性的(在一定时间后失效)。
- 安全性:Cookies可以被篡改,因此对于敏感信息的存储需要谨慎处理。
- 用途:常用于存储少量的用户信息、用户偏好设置、跟踪用户行为等。
-
Sessions(会话):
- 存储位置:Sessions存储在服务器端,通常在服务器的内存中或数据库中。
- 容量限制:Sessions的大小受服务器内存或数据库容量的限制。
- 持久性:Sessions通常在用户关闭浏览器或一定时间后失效,可以持久保持用户状态。
- 安全性:Sessions相对于Cookies更安全,因为存储在服务器端,客户端无法直接访问和修改。
- 用途:Sessions通常用于存储用户的登录状态、购物车信息、会话数据等。
关系:
- 通常,Cookies中会包含一个用于标识用户会话的唯一标识符(如Session ID),而这个Session ID对应于服务器端存储的会话数据。
- 当用户第一次访问网站时,服务器会创建一个会话,并将会话ID存储在Cookie中发送给客户端。客户端在后续请求中通过Cookie中的会话ID来识别自己的会话。
- 服务器根据会话ID来检索相应的会话数据,从而实现跟踪用户状态和保持用户登录状态等功能。
总的来说,Cookies存储在客户端,容量较小,持久性较强,可以被篡改;而Sessions存储在服务器端,容量较大,相对更安全,用于保持用户状态和存储会话数据。在实际应用中,通常会结合使用Cookies和Sessions来实现不同的功能需求。
本文详细介绍了Cookie和Session在Web开发中的作用、工作原理、常用方法以及它们的区别和联系,包括存储位置、容量限制、持久性、安全性和应用场景。
1689

被折叠的 条评论
为什么被折叠?



