Http 协议的无状态性

无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器

session

  • session表示客户端与服务器的一次对话
  • Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间
  • 从上述定义中可以看到,session实际上是一个特定的时间概念

在服务器的内存中保存着不同用户的session,也就是说每一个用户对应着一个session,不同的用户对应着不同的session

  • session 对象是一个JSP内置对象
  • session对象在第一个JSP页面被加载时自动创建,用来完成会话期管理
  • 从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话
  • 当一个客户访问一个服务器时,可能会在服务器的几个页面之间切换,服务器应当通过某种办法这是一个客户,就需要session对象
  • session对象是HttpSession类的实例

session 对象常用方法:

  • long getCreationTime(): 返回 session 创建时间
  • public String getId(): 返回 session 创建时,JSP 引擎为它设的唯一ID号
  • public Object setAttribute( String name, Object value): 使用指定名称将对象绑定到此会话
  • public Object getAttribute( String name ): 返回与此会话中的指定名称绑定在一起的对象,如果没有对象绑定在该名称下,则返回 null
  • String[] getValueNames(): 返回一个包含次此 session 中所有可用属性的数组
  • int getMaxInactiveInterval(): 返回两次请求间隔多长时间此 session 被取消(单位:秒)
<%@ page language="java" import="java.text.*, java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("username", "Kobe");
%> session 的创建时间:<%=sdf.format(d) %><br> <%--session.getCreationTime() 返回的是一个毫秒数 --%>
<%--new Date(session.getCreationTime()) Thu Mar 08 09:57:56 CST 2018 --%>
session ID: <%=session.getId() %><br>
获取用户名:<%=session.getAttribute("username") %>
</body>
</html>

页面运行结果:

现在原来的 session.jsp 代码中添加一个超链接,用来体现从进入网站到浏览器关闭期间,是同一次会话,注意观察 sessionID 是否发生改变,如果发生改变则证明不是同一次会话,如果不变则证明是同一次会话

<a href="session2.jsp" target="_blank">跳转到 session2.jsp 页面</a>

同时,创建一个新的页面 session2.jsp,查看 sessionID 以及能否拿到同一次会话中服务器保存的username 属性

<%@ page language="java" import="java.text.*, java.util.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body> session ID: <%=session.getId() %><br>
获取用户名:<%=session.getAttribute("username") %>
</body>
</html>

注意查看id 和 username

现在演示下 session.getValueNames() 的用法

在session.jsp 中另外添加两个属性,password 和 age

<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("username", "Kobe");
// 新增加两个属性 password 和 age
session.setAttribute("password", "123456");
session.setAttribute("age", 28);
%>

在session2.jsp 中来查看有哪些可用的属性

session ID: <%=session.getId() %><br>
session 中保存的用户名:<%=session.getAttribute("username") %><br>
session 中保存的属性有:
<%
String[] names = session.getValueNames();
for (String name:names){
out.println(name + "&nbsp;&nbsp;");
}
%>

页面结果:

再来看下如何设置session的过期时间,session.jsp

<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 hh:mm:ss");
Date d = new Date(session.getCreationTime());
session.setAttribute("username", "Kobe");
// 新增加两个属性 password 和 age
session.setAttribute("password", "123456");
session.setAttribute("age", 28); // session.setMaxInactiveInterval() 设置 session的过期时间,单位秒
session.setMaxInactiveInterval(3);
%>

再次点击超链接时,我们发现sessionID改变了,属性值为null,属性没有,说明这是一个新的会话。也就是说间隔3秒以后,原来的session过期了

session 生命周期

创建 ---> 活动 ---> 销毁

1、创建

2、活动(新的 session启动并不意味着旧的session已经关闭)

3、销毁

Tomcat 默认 session超时时间为 30分钟,设置 session 超时有两种方式:

1、session.setIntactiveInterval(时间); // 单位:秒

2、在 web.xml 配置

<session-config>
<session-timeout> 10 </session-timeout>
</session-config> // 单位:分钟

Cookie

中文名称为“小甜饼”,是Web服务器保存在 客户端 的一系列文本信息。Cookie 是键值对形式存储的少量信息

作用:

平时上网时都是使用 无状态的HTTP协议输出数据,这意味着客户端与服务端在数据传送完成后就会中断连接。这时我们就需要一个一直保持会话连接的机制,在session出现之前,cookie就完全充当了这个角色。

  • 对特定对象的追踪
  • 保存用户网页浏览记录与习惯
  • 简化登录

安全风险:容易泄露用户信息

典型应用一:判定注册用户是否已经登录网站

典型应用二:“购物车”的处理

原理:

客户端请求服务器时,如果服务器需要记录该用户的状态,就使用response对象向客户端发送一个cookie,客户端浏览器会把cookie保存起来。当浏览器再请求服务器时,浏览器把请求的网址连同该cookie一同提交给服务器,服务器通过检查该cookie来获取用户状态

Jsp中创建与使用Cookie

创建Cookie对象

Cookie newCookie = new Cookie(String key, Object value);

// 例如
Cookie c = new Cookie("username", "peter");
c.setMaxAge(24*60*60); // 设置过期时间为1天,单位是秒
response.addCookie(c); // 保存 cookie到客户端

写入Cookie对象

response.addCookie(newCookie);

读取Cookie对象

// 使用 Jsp 读取cookie,需要通过调用 HttpServletRequest 的 getCookies() 方法来创建一个 javax.servlet.http.Cookie 对象的数组。然后循环遍历数组,并使用 getName() 和 getValue() 方法来访问每个cookie和关联的值

Cookie[] cookies = request.getCookies();

常用方法

void setMaxAge(int expiry)       ---> 设置 cookie 的有效期,以秒为单位

void setValue(String value)       ---> 在 cookie 创建后,对 cookie 进行赋值

String getName()                      ---> 获取 cookie 的名称

String getValue()                       ---> 获取 cookie 的值

int getMaxAge()                        ---> 获取 cookie 的有效时间,以秒为单位

示例:新建一个 form.jsp 提交到 setCookies.jsp 页面,在该页面中保存 cookie,然后在 getCookies.jsp 页面读取 cookie

form.jsp

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>用户登录表单</h1>
<hr> <form action="setCookies.jsp" method="post">
用户名:<input type="text" name="username" value=""/>
密码:<input type="password" name="password" value=""/>
<input type="submit" value="提交"/> </form>
</body>
</html>

setCookies.jsp   (这里对保存进cookie中的内容进行编码,否则,读取中文cookie会报错)

<%@ page language="java" import="java.net.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body> <h1>接收表单并设置cookies</h1>
<hr>
<%
request.setCharacterEncoding("utf-8");
// 从request请求中获取用户名和密码
String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
String password = URLEncoder.encode(request.getParameter("password"), "utf-8"); // 创建cookie对象
Cookie usernameCookie = new Cookie("username", username);
Cookie passwordCookie = new Cookie("password", password); // 设置Cookie保存时间
usernameCookie.setMaxAge(24*60*60);
passwordCookie.setMaxAge(24*60*60); // 保存cookie
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
%> <a href="getCookies.jsp">查看Cookie</a> </body>
</html>

getCookies.jsp (要对cookie进行解码操作)

<%@ page language="java" import="java.net.*" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body> <h1>获取cookies</h1>
<hr>
<%
String username = "";
String password = ""; // 读取 cookies
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0){
for(Cookie c:cookies){
if("username".equals(c.getName())){
username = URLDecoder.decode(c.getValue(), "utf-8");
}
if("password".equals(c.getName())){
password = URLDecoder.decode(c.getValue(), "utf-8");
}
}
}
%> 用户名:<b><%=username %></b><br><br>
密码:<b><%=password %></b><br><br> </body>
</html>

运行效果:

Session 与 Cookie 对比

session cookie
服务器 端保存用户信息 客户端 保存用户信息
session 中保存的是 Object 类型 cookie 中保存的是 String 类型
随会话的结束而将其存储的数据 销毁 cookie 可以 长期 保存在客户端
保存 重要 信息 保存 不重要 的用户信息

JSP 状态管理 -- Session 和 Cookie的更多相关文章

  1. JSP状态管理 及 Cookie实例

    HTTP协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端的请求. 但是当同一个浏览器再次发送请求给了服务器的时候,服务器并不知道它就是刚才那个浏览器. 简单地说,就是服务器 ...

  2. Unit07: 状态管理-Session

    Unit07: 状态管理-Session web package web; import java.io.IOException; import java.io.PrintWriter; import ...

  3. [原创]java WEB学习笔记31:会话与状态管理 session机制 概述(定义,session机制,session的声明周期,保存session的方式,Session的创建与删除)

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  4. jsp状态管理

    http无状态协议 服务器记不住你 每次浏览器访问,服务器不会特点保存相应信息,故记不住你 jsp状态存储的两种机制 cookie 存储在客户端 用途: 1.简化登陆 2.追踪特定对象 3.保存用户常 ...

  5. Java遇见HTML——JSP篇之JSP状态管理

    一.http协议的无状态 无状态性是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求.但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才的那个浏览器.简单的说,就是服务器不 ...

  6. 什么是Http无状态?Session、Cookie、Token三者之间的区别

    一.什么是HTTP无状态? 1.1定义: HTTP无状态协议,是指协议对于交互性场景没有记忆能力. 1.2举个例子: 在点击一个纯的html网页,请求获取服务器的html文件资源时,每次http请求都 ...

  7. JSP状态管理_1_Cookie

    http协议的无状态性:当浏览器发送请求飞服务器时,服务器相应客户端请求:但当同一个浏览器再次发送请求给浏览器时,服务器并不知道它就是刚才那个客户端. 保存用户状态的两大机制:Session,Cook ...

  8. JSP | 基础 | JSP状态管理 | Cookie

    Cookie : 是web服务器保存在客户端的一系列文本信息. Cookie的作用: 1.对特定的对象的追踪 2. 3. JSP中创建Cookie以及使用 创建Cookie对象 写入Cookie对象 ...

  9. HTTP状态管理机制之Cookie

    一.cookie 起源 cookie 最早是网景公司的雇员 Lou Montulli 在1993年3月发明,后被 W3C 采纳,目前 cookie 已经成为标准,所有的主流浏览器如 IE.Chrome ...

随机推荐

  1. go语言nsq源码解读二 nsqlookupd、nsqd与nsqadmin

    nsqlookupd: 官方文档解释见:http://bitly.github.io/nsq/components/nsqlookupd.html 用官方话来讲是:nsqlookupd管理拓扑信息,客 ...

  2. BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP

    BZOJ_1030_[JSOI2007]文本生成器_AC自动机+DP Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他 ...

  3. kmspico_setup.exe运行提示系统资源不足,无法完成请求的服务

    在使用KMSpico激活office时,windows下运行exe会提示系统资源不足,无法完成请求的服务. 我的解决方法是:卸载电脑上的wps...

  4. input表单中嵌入百度地图

    在做项目开发中,常常会用到定位的操作,比如在做一些资产房产等方面的业务的时候,需要知道资产的具体位置,并将位置信息保存下来,这个时候我们可以使用form表单嵌入百度地图的方式来实现这个功能,下面请看详 ...

  5. Java Native Interface调用C++代码

    概述 Java Native Interface译为Java原生接口,简称JNI.Java并不是完美的,它的不足体现在运行速度要比传统的C++慢上许多,并且无法直接访问到操作系统底层,为此Java提供 ...

  6. 从壹开始 [ Nuxt.js ] 之一 || 为开源收录Bug之 TiBug项目 开篇讲

    缘起 哈喽大家周二好呀,刚刚经历过了几天火车抢票,整个人都不好了,不知道小伙伴对今年的春节是否还一如既往的期待呢,眼看都要春节了,本来也想写篇2018总结篇,但是怕不免会出现鸡汤文的窠臼嫌疑,想想还是 ...

  7. 前端笔记之Canvas

    一.Canvas基本使用 Canvas是HTML5的画布,Canvas算是“不务正业”的面向对象大总结,将面向对象玩极致. 算法为王!就是说canvas你不会,但是算法好,不怕写业务,不怕代码量,只要 ...

  8. WebGL three.js学习笔记 纹理贴图模拟太阳系运转

    纹理贴图的应用以及实现一个太阳系的自转公转 点击查看demo演示 demo地址:https://nsytsqdtn.github.io/demo/solar/solar three.js中的纹理 纹理 ...

  9. 如何理解Axis?

    前言 只有光头才能变强. 回顾前面: 从零开始学TensorFlow[01-搭建环境.HelloWorld篇] 什么是TensorFlow? TensorFlow读写数据 不知道大家最开始接触到axi ...

  10. Linux(CentOS 7)安装测试svn服务

    1.yum install subversion,通过yum安装svn服务 2.svnserve --version,查看是否安装成功 3.mkdir -p /home.svn,创建svn仓库目录 4 ...