一:

1.介绍

  对于会话与状态管理,有两种方式,cookie与session。

  其中,cookie机制采用客户端保持cookie的方案。

  而,session机制采用的是服务器保持Http状态信息的方案。

  

2.响应方式

  以cookie的方式进行实现的。

  浏览器打开,对服务器进行访问,这时因为第一次进行访问,所以没有sessionId,所以服务端会新建一个HttpSession,将sessionId以set-cookie的方式将sessionId返回给浏览器,在这次会话中,浏览器进行下次访问服务端时,会以cookie的方式将返回的sessionId带上,与服务端保存的sessionId进行比较,完成下面的会话。

3.保存sessionId的几种方式

  保存sessionId可以采用cookie,这样交互过程中浏览器可以自动根据规则把这个标识发送给服务器。

  因为cookie会被禁用,因此必须有其他的机制能够把sessionId传递给服务器,经常采用的是URL重写,就是将sessionI附加到URL路径的后面。

4.Seeion cookie

  session通过SessionId区分不同的客户,以cookie或URL重写为基础的。

  默认使用cookie实现,系统会创造一个名为JSESSIONID的输出cookie,成为session cookie,以区别常说的cookie。

  session cookie是存储在浏览器的内存中,并不写到硬盘上,但是也可以进行持久化写到硬盘。

5.持久化程序

  在一段时间内再次打开浏览器,SessionId不会变。

 <%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<%=session.getId() %>
<%
Cookie cookie=new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60);
response.addCookie(cookie);
%>
</body>
</html>

二:session的生命周期

1.JSP什么时候不产生session对象

  若当前的JSP是客户端是web应用的第一个资源,切JSP的page指定的session属性值为false。

  当前的JSP不是客户端访问的第一个应用资源,且其他页面已经创建HttpSession对象,则当前的JSP会返回一个会话的HttpSession对象,而不是创建一个新的HttpSession对象。

2.Servlet什么时候产生session对象

  若servlet是客户端访问的第一个web应用资源,则只用调用了request.getSession()或者request.getSession(true)才会创建HttpSession对象。

3.session=“false”

  当前页面禁用HttpSession隐含对象。

  但是可以通过request.getSession(boolean flag),若flag为false,若没有和当前JSP页面关联的HttpSession对象,则返回null,若有,返回true。

若flag为true,若没有和当前JSP页面关联的HttpSession对象,则一定返回一个新创建的HttpSession,有,则直接返回。

4.销毁HttpSession

  调用session.invalidate(),该方法使HttpSession马上失效。

  服务器卸载当前应用。

  超出过期时间,以秒为单位,默认半个小时,可是设置,session.setMaxInactiveInterval(60)。

  注:不是关闭浏览器就关闭了HttpSession。

三:案例(重新登录与注销)

1.login.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
SessionId:<%=session.getId() %><br><br>
SessIsNes:<%=session.isNew() %><br><br>
MaxInactiveInternal:<%=session.getMaxInactiveInterval() %><br><br>
createTime:<%=session.getCreationTime() %><br><br>
LastAccessTime:<%=session.getLastAccessedTime() %><br><br>
<%
Object username=session.getAttribute("userName");
if(username==null){
username="";
}
%> <form action="hello.jsp" method="post">
userName:<input type="text" name="userName"
value="<%=username%>"/>
<input type="submit" value="Submit"/>
</form>
</body>
</html>

2.hello.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
SessionId:<%=session.getId() %><br><br>
SessIsNes:<%=session.isNew() %><br><br>
MaxInactiveInternal:<%=session.getMaxInactiveInterval() %><br><br>
createTime:<%=session.getCreationTime() %><br><br>
LastAccessTime:<%=session.getLastAccessedTime() %><br><br>
Hello:<%=request.getParameter("userName") %><br><br> <%
session.setAttribute("userName", request.getParameter("userName"));
%>
<a href="login.jsp">重新登录</a>&nbsp;&nbsp;
<a href="loginOff.jsp">注销</a> </body>
</html>

3.loginOff.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=ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
SessionId:<%=session.getId() %><br><br>
SessIsNes:<%=session.isNew() %><br><br>
MaxInactiveInternal:<%=session.getMaxInactiveInterval() %><br><br>
createTime:<%=session.getCreationTime() %><br><br>
LastAccessTime:<%=session.getLastAccessedTime() %><br><br>
ByBye:<%=request.getAttribute("userName") %><br><br>
<a href="login.jsp">重新登录</a>&nbsp;&nbsp;
<%
session.invalidate();
%> </body>
</html>

4.效果

  

四:URL重写

1.方式

  一种补充的会话管理机制,它允许不支持Cookie的浏览器也可以与WEB服务器保持连续的会话。

  HttpServletResponse里定义了两个用于完成URL重写的方法

  encodeURL方法

  encodeRedirectURL方法

  上面的两种方式都一样。

2.encodeURL方式

  

五:

  

Session机制一(基础知识点)的更多相关文章

  1. C#基础知识之理解Cookie和Session机制

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  2. 【原创】Java基础之Session机制

    Session机制 JSESSIONID是Session的标识,当客户端请求服务器端的时候,服务器端会检查是否已经给这个客户端创建过Session,也就是看客户端的请求中的header是否有Cooki ...

  3. HTTP基础--cookie机制和session机制

    1.介绍cookie和session的区别,怎么获取与使用?(这个问题比较开放,可深可浅,现在将这里涉及的主要问题总计如下答案) 答: 一.cookie机制和session机制的区别 cookie机制 ...

  4. Redis基础知识点面试手册

    Redis基础知识点面试手册 基础 概述 数据类型 STRING LIST SET HASH ZSET(SORTEDSET) 数据结构 字典 跳跃表 使用场景 会话缓存 缓存 计数器 查找表 消息队列 ...

  5. .NET基础知识点

    .NET基础知识点   l  .Net平台  .Net FrameWork框架   l  .Net FrameWork框架提供了一个稳定的运行环境,:来保障我们.Net平台正常的运转   l  两种交 ...

  6. Cookie/Session机制详解

    会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...

  7. 理解Cookie和Session机制(转)

    目录[-] Cookie机制 什么是Cookie 记录用户访问次数 Cookie的不可跨域名性 Unicode编码:保存中文 BASE64编码:保存二进制图片 设置Cookie的所有属性 Cookie ...

  8. session机制详解以及session的相关应用

    session是web开发里一个重要的概念,在大多数web应用里session都是被当做现成的东西,拿来就直接用,但是一些复杂的web应用里能拿来用的session已经满足不了实际的需求,当碰到这样的 ...

  9. Cookie/Session机制

    这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...

随机推荐

  1. Mongodb 笔记06 副本集的组成、从应用程序连接副本集、管理

    副本集的组成 1. 同步:MongoDB的复制功能是使用操作日志oplog实现的,操作日志包含了主节点的每一次写操作.oplog是主节点的local数据库中的一个固定集合.备份节点通过查询整个集合就可 ...

  2. Liunx常用命令(Mile)

    记录一些平时经常用到的liunx命令,解决用过一段时间不用又忘记的问题.慢慢添加,持续更新~~~ 1.文件操作 a.zip.war包解压 war包 用的zip的方式压缩 ,也可以用的zip的 解压命令 ...

  3. 推荐一些我所用的firefox 附加组件。

    firefox之所以强大,很大程度上是因为它有着超多的扩展组件,来实现许多有趣的功能.这几天把我装的firefox附加组件整理下,个人认为是一般上网常用或者可以说是必备的组件,o(∩_∩)o ,晒晒. ...

  4. 【leetcode 简单】 第八十一题 4的幂

    给定一个整数 (32 位有符号整数),请编写一个函数来判断它是否是 4 的幂次方. 示例 1: 输入: 16 输出: true 示例 2: 输入: 5 输出: false 进阶: 你能不使用循环或者递 ...

  5. sql 通过分数字段倒排获取名次的方法

    row_number() over(order by sort desc) 应用场景: 比如学员成绩表中有userid,username,sorce登字段,需要取出学员成绩的名次:表中没有名次字段,只 ...

  6. Java并发编程(3) JUC中的锁

    一 前言 前面已经说到JUC中的锁主要是基于AQS实现,而AQS(AQS的内部结构 .AQS的设计与实现)在前面已经简单介绍过了.今天记录下JUC包下的锁是怎么基于AQS上实现的 二 同步锁 同步锁不 ...

  7. ROS多线程订阅消息

    对于一些只订阅一个话题的简单节点来说,我们使用ros::spin()进入接收循环,每当有订阅的话题发布时,进入回调函数接收和处理消息数据.但是更多的时候,一个节点往往要接收和处理不同来源的数据,并且这 ...

  8. Ubuntu使用apt-get upgrade升级时出错

    今天在按照常规的sudo apt-get update更新软件列表后,再使用sudo apt-get upgrade升级软件时,出现了以下的错误: 正在设置 linux-image-extra-4.4 ...

  9. fcntl函数的用法总结

    fcntl系统调用可以用来对已打开的文件描述符进行各种控制操作以改变已打开文件的的各种属性 函数原型:   #include<unistd.h> #include<fcntl.h&g ...

  10. 超简单的qps统计方法(推荐)【转】

    统计最近N秒内的QPS值(包括每秒select,insert等值) mysql> select variable_name,sum(per_sec) as qps from (select st ...