一、session的特点及其实例

session:同一次会话共享
 a.浏览网站:开始->关闭
 b.购物:浏览、付款、退出
 c.电子邮件:浏览、写邮件、退出
  从一次开始到一次结束,是一次会话。
  客户端第一次访问服务器时:(因为不存在Cookie的JSESSIONID,无法匹配成功,所以分配)
  客户通过浏览器访问服务器,服务端产生一个session来接待他,产生的session自带一个sessionID(通过sessionID来区分不同的session),服务端会将产生的sessionID复制一份,即JSESSIONID,服务端会将JSESSIONID包含在Cookie中发送给服务器。(服务端和客户端通过Cookie和session对应起来,两者的连接者是通过JSESSIONID和sessionID相同的原理来匹配,实现一一对应)
  客户端第二/n次访问时,直接对客户端已有的Cookie中的JSESSIONID和服务端的session中的sessionID进行匹配,如果匹配成功(JSESSIONID和sessionid相同),说明不是第一次访问,无需登录,实现一一对应。

类似于商城的存包处
  客户端:顾客;
  服务端:商场存包处;
  顾客第一次存包:先判断有没有钥匙(JSESSIONID),没有,就分配一个。
  顾客第二次存包:判断有没有钥匙(JSESSIONID),有,就进行匹配,找到对应的箱子(session).

session特点:
  a.session存储在服务端。
  b.session是在同一个客户请求时共享。
  c.session实现机制:第一次用户请求时产生sessionID,并复制给Cookie的JSESSIONID,然后发送给客户端。

session方法:
  String getID():获取sessionID
  boolean isNew():判断是否是新用户(第一次访问)。
  void invalidate():使session失效(退出登录、注销)。
  //失效只失效当前session

void getAttribute()
  Object setAttribute()

void setMaxInactiveInterval():设置最大有效非活动时间
  //如设该时间为30分钟,就是当你从此处离开一段时间,如在30分钟内,可以直接继续操作,如超过30分钟,则需要重新登录。
  int getMaxInactiveInterval():获取当前最大有效非活动时间
 
  浏览器的session共享

实例

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body> <form action="check.jsp" method="post">
用户名<input type="text" name="uname" > <br/>
密码<input type="password" name="upwd"> <br/>
<input type="submit" value="登录"> <br/>
</form>
</body>
</html>

check.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//设置编码
request.setCharacterEncoding("utf-8");
//获取用户名和密码
String name=request.getParameter("uname");
String pwd=request.getParameter("upwd");
//进行检验,此处未使用数据库,以此替代
if(name.equals("张志伟")&&pwd.equals("123456"))//假设用户及密码
{
//如果登录成功,获取两个session
session.setAttribute("uname", name);
session.setAttribute("upwd", pwd); //将sessionID打印到控制台
System.out.println("sessionID"+session.getId());
//设置最大非活动有效时间为50秒
session.setMaxInactiveInterval(50); Cookie cookie= new Cookie("uname",name);
response.addCookie(cookie); request.getRequestDispatcher("welcome.jsp").forward(request, response);
}
else
{//登陆失败
response.sendRedirect("login.jsp");
}
%>
</body>
</html>

welcome.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎您:
<%
String name = (String)session.getAttribute("uname");
//如果客户没有登录,直接通过地址访问,获取的name值为null,就让它返回登录界面去登陆
if(name!=null)
{
out.print(name); %> <a href="invalidate.jsp">注销</a>
<%
}
else
{
request.getRequestDispatcher("login.jsp");
}
%>
</body>
</html>

invalidate.jsp此页面是注销页面,负责使session失效

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
//删除全部session
session.invalidate(); //重定向到登录页面
response.sendRedirect("login.jsp");
//删除指定的部分
//session.removeAttribute("uname");
%>
</body>
</html>

a.jsp此页面的存在是为了检查session是否失效成功,并检验sessionID和JSESSIONID是否匹配成功。

<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
out.print( session.getAttribute("uname")); Cookie []cookies=request.getCookies();
for(Cookie cookie:cookies)
{
if(cookie.getName().equals("JSESSIONID"))
{
System.out.println(cookie.getValue());
}
}
%>
</body>
</html>

下面是测试截图

点击登录,经过check.jsp的校验,跳转至welcome.jsp

此时的a.jap显示了通过session获取的name

控制台中输出了sessionID和cookie.getValue(),

前者说明登录成功,后者说明sessionID和JSESSIONID成功匹配

在点击注销后,name为null,说明使session失效成功

cookie和session的区别
                        cookie                         session
  保存的位置             客户端                          服务端
  安全性                 较不安全                        较安全
  保存的内容             String                          Object

此处不注意会报错。

session的返回对象value是Object类型

cookie的保存是String类型

三、如何使eclispe关联源代码

首先按住Ctrl,将鼠标移动至要关联的类,如Cookie,Cookie下会出现一条蓝线,单击它。

到Tomcat官网去下载配套源码包(请参照之前的博客)

http://tomcat.apache.org/

下载Source Code Distributions中的zip,建议将这些安装包放到一起,便于寻找

点击后进行关联,找到刚才下载的zip源码包

点击OK即可,再次按住Ctrl点击Cookie,即可查看源代码

Ctrl+O

查看

Ctrl+shift+T:查找session的源码

JSP九大内置对象之session以及eclispe如何关联源码的更多相关文章

  1. jsp九大内置对象之session和application

    session和application 用的都是特别多尤其是application,但是想全面学习一下内置对象所以都了解一下. session又被称为是会话生存期是用户进入浏览器到关闭浏览器的期间.s ...

  2. JSP九大内置对象的作用和用法总结?

    JSP九大内置对象的作用和用法总结? 1.request对象javax.servlet.http.HttpServletRequest request对象代表了客户端的请求信息,主要用于接受通过HTT ...

  3. JSP 九大内置对象

    JSP 九大内置对象: 一 out对象主要用来向客户端输出各种数据类型内容,并且管理应用服务器上的输出缓冲区.out.print()//输出数据out.newLine()//输出一个换行符out.fl ...

  4. Jsp九大内置对象及其作用域

    本文主要介绍Jsp九大内置对象及其作用域,着重介绍几个常用的,希望对初学者有所帮助. 1 Jsp九大内置对象 2 详细介绍 2.1 request javax.servlet.http.HttpSer ...

  5. JSP九大内置对象分析

    JSP九大内置对象分为三类: 1.输入输出对象:out对象.response对象.request对象 2.通信控制对象:pageContext对象.session对象.application对象 3. ...

  6. JSP九大内置对象(转载)

    JSP中一共预先定义了9个这样的对象,分别为:request.response.session.application.out.pagecontext.config.page.exception 1. ...

  7. JSP九大内置对象和四个作用域

    JSP九大内置对象和四个作用域 在学习JSP的时候,首先就要先了解JSP的内置对象,什么是内置对象呢?内置对象也叫隐含对象,就是不需要预先声明就可以在脚本代码和表达式中随意使用.而这样的内置对象在JS ...

  8. JSP九大内置对象和四种属性范围解读

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文首先主要解说了JSP中四种属性范围的概念.用法与实例. 然后在这个基础之上又引入了九 ...

  9. JSP——九大内置对象和其四大作用域

    一.JSP九大内置对象: JSP根据Servlet API 规范提供了某些内置对象,开发者不用事先声明就可以使用标准的变量来访问这些对象. Request:代表的是来自客户端的请求,例如我们在FORM ...

随机推荐

  1. HDU 2066最短路径Dijkstra、

    思路:枚举所有起点城市然后比较每个起点所去喜欢城市的最小距离 #include<cstdio> #include<cmath> #include<cstring> ...

  2. git 提交添加 emoij 文字

    可能看到 git 提交是文本,就认为他无法使用表情图片,实际上 git 提交是可以添加表情 本文告诉大家如何做出下面图片提交 在 git 提交的时候,可以添加表情,只需要在字符串加上表示表情的文本 如 ...

  3. jstack简介

    jstack:Java进程中线程的堆栈信息跟踪工具 功能简介 jstack常用来打印Java进程/core文件/远程调试端口的Java线程堆栈跟踪信息,包含当前虚拟机中所有线程正在执行的方法堆栈信息的 ...

  4. 纯CSS制作空心三角形和实心三角形及其实现原理

    纯CSS制作空心三角形和实心三角形及其实现原理 在一次项目中需要使用到空心三角形,我瞬间懵逼了.查阅了一些资料加上自己的分析思考,终于是达到了效果,个人感觉制作三角形是使用频率很高的,因此记录下来,供 ...

  5. oracle解除被锁定的表的状态

      select b.owner,b.object_name,a.session_id,a.locked_mode,c.serial#,c.sid||','||c.serial# from v$loc ...

  6. ES6类的继承

    ES6 引入了关键字class来定义一个类,constructor是构造方法,this代表实例对象. constructor相当于python的init 而this 则相当于self 类之间通过ext ...

  7. docker 命令汇总1

    命令汇总 docker history fa5fa5为镜像id或者镜像名 docker export 30b >h.tar30b为容器id或者容器名# docker export angry_b ...

  8. 第二阶段:2.商业需求分析及BRD:6.商业需求文档2

    BRD的三个诉求:1.项目很重要,支持.2.有价值,获得重视,纳入战略规划中.3.需要资源,横向的协调资源.   方法:知道决策层是哪些组成,同时找到合适的决策层. BRD决策分类:1.找资本类(CF ...

  9. lombok工作原理分析

    在Lombok使用的过程中,只需要添加相应的注解,无需再为此写任何代码.但是自动生成的代码到底是如何产生的呢? 核心之处就是对于注解的解析上.JDK5引入了注解的同时,也提供了两种解析方式. 运行时解 ...

  10. ELK学习实验010:Logstash简介

    Logstash是具有实时流水线功能的开源数据收集引擎.Logstash可以动态统一来自不同来源的数据,并将数据规范化为您选择的目标.清除所有数据并使其民主化,以用于各种高级下游分析和可视化用例. 虽 ...