Session的理解
一.Session简介
Session的使用场景
当我们登陆电商网站时,无论浏览哪个页面都会显示登陆人的名字,还可以随时查看购物车里面的商品
也就是说当一个用户浏览一个网站的不同页面时,服务器怎么知道此时是张三在访问还是李四在访问
这也就引出我们的另一个会话技术Session 与cookie不同session是保存在服务器端上,在每一次与浏览器的会话中,服务器都会创建该会话独享的session空间用于存储数据,用户浏览多个页面时可以从session对象中读取数据进行相关操作
- 会话
在解释session前,我们要先了解什么是会话。会话就是用户通过浏览器访问多个网站页面,并关闭浏览器这一过程,严谨的讲一次会话和浏览器保存的JSessionID和服务器端保存的Session对象有关
总之,用户通过浏览器访问服务器,并操作Session时,服务器会在内存中为这次会话分配一个Session对象,被该浏览器所独占。
这个session可以看作一个容器/集合,默认存在时间为30分钟(可以在web.xml文件中修改)
二.Session的简单理解
1. Session的存储结构
session的存储结构类似于HashMap,相当于一张表
2. Session简单的执行流程
总结session的实现基于cookie,服务器端通过得到cookie来判断是一个新的会话,还是以前的会话
三.Session的使用
- 创建session
getSession方法的调用在某些情况下就相当于创建了一个Session对象
HttpSession session = request.getSession();
什么时候创建session
- 浏览器的HTTP请求cookie中没有携带JSESSIONID
- 浏览器的HTTP请求cookie中携带了JSESSIONID,但在服务器内存中没有与其匹配的JESSIONID
抓包分析
如果浏览器没有携带JESSIONID,操作session时服务器会为该浏览器分配一个ID以cookie的形式返回给浏览器进行保存
再此访问该服务器资源时浏览器会携带上次分配的JSESSIONID,到服务器端找到对应的session对象进行数据的操作
- 向session添加/读取属性
session.setAttribute("user", "jbc");
session.getAttribute("user");
- 移除session中的属性
session.removeAttribute("user");
- 获取JESSIONID
每一个session对象都有与之唯一对应的JSESSIONID
session.getID();
- 判断是否是新创建的session
session.isNew();
四.Session的生命周期
setMaxInterval方法设置session的生命周期(以秒为单位)
正数是session的超时时间
负数为永不超时
getMaxInterval()得到该session的生命周期
invalidate()销毁该session
在没有设置session的超时时长时默认为30分钟失效
Tomcat会在底层轮询存储JSESSIONID-session的容器,如果最近访问时间
lastAccessDate与现在的时间超过session的MaxInterval,就会销毁该session
要说明的是session的生命周期是:浏览器能够访问到该session间隔的最大时长,而不是累计时长,在每次访问session时都会重置session的MaxInterval
代码举例
创建与访问该资源的浏览器关联的session对象,设置超时时长60秒
HttpSession session = request.getSession();System.out.println("JSessionID= " + session.getId());session.setMaxInactiveInterval(60);session.setAttribute("user", "jbc");
读取当前会话的session中的数据
HttpSession session = request.getSession();System.out.println("JSessionID= " + session.getId());System.out.println(session.getAttribute("user"));
抓包分析
由于我们没有携带JSESSIONID,服务器分配了这次会话的ID
分析可知,在超过60秒后,服务器会将这次会话的session销毁,
这时我们再想要读取该session中的数据时,我们发现服务器端又返回了一个新的JSESSIONID,说明原来的会话已经被销毁,再对session进行操作时,服务器认为当前是新的会话,会创建session对象并返回给浏览器SID
需要再次说明的是session的生命周期是指,间隔的最大时长,如果在间隔时间内再次访问就会重置他的生命周期
五.应用实例
1.只要密码为 666666, 我们认为就是登录成功 ,用户名不限制
2. 如果验证成功,则进入管理页面 ManageServelt.java ,否则进入 error.html
3. 如果用户直接访问 ManageServet.java , 重定向到到 login.html
此案例只是为了理解session做的简单案例
package homework;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;@WebServlet(name = "LoginCheck", value = "/LoginCheck")
public class LoginCheck extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {String pwd = request.getParameter("pwd");//如果密码正确就创建一个会话if ("666666".equals(pwd)) {HttpSession session = request.getSession();session.setAttribute("username", request.getParameter("username"));request.getRequestDispatcher("/Manger").forward(request, response);} else {//否则请求转发到error.html request.getRequestDispatcher("/error.html").forward(request, response);}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
package homework;import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.io.PrintWriter;@WebServlet(name = "Manger", value = "/Manger")
public class Manager extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {HttpSession session = request.getSession();String username = (String) session.getAttribute("username");//获得一个session对象如果该session对象是刚刚创建的//该对象就不会存储username这一属性,就可以判断用户是非法访问的该资源if (username == null) {//重定向到login.htmlresponse.sendRedirect("/session/login.html");} else {//如果是通过CheckLogin通过的就显示成功登陆response.setContentType("text/html;charset=utf-8");PrintWriter writer = response.getWriter();writer.print("<h1>欢迎" + username + "登陆</h1>");}}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doGet(request, response);}
}
Session的理解相关推荐
- [html] 说说你对cookie和session的理解
[html] 说说你对cookie和session的理解 cookie: 可以通过客户端, 服务端设置, 容量小, 可以通过设置domain来实现同步登录, 除了name, value, 它还有多个选 ...
- Spark session 深入理解
Spark session Spark session 深入理解 创建SparkSession Builder 的方法如下: 设置参数 读取元数据 读取数据 使用SparkSQL 存储/读取Hive表 ...
- 对cookie与session的理解
cookie: 在网站中,http请求是无状态的.也就是说即使第一次和服务器连接后并且登录成功后,第二次请求服务器依然不能知道当前请求是哪个用户. cookie的出现就是为了解决这个问题, 第一次登录 ...
- Java Web之Cookie和Session的理解
日常现象 登录了某个网站,过一会儿再登录,诶,不用输入密码了,直接是登录状态了,好神奇~~~ 在某网站看了一部手机,接下来浏览其他网站,旁边的广告全是手机和类似信息,好恐怖~~~ 浏览某网站时,提示我 ...
- cookie和session的理解
一个常见的错误是以为 session 在有客户端访问时就被创建,然而事实是直到某 server 端程序(如 Servlet )调用HttpServletRequest.getSession(true) ...
- hibernate中SessionFactory,Session的理解?
Session接口 Session接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会 ...
- 对session的理解
java Servlet API引入session 机制来跟踪客户的状态,session指的是在一段时间内,单个客户和web服务器之间一连串的交互过程,在一个session中,一个客户可能会多次请求同 ...
- 说说对javaee中的session的理解
在服务器上,通过Session来区分每一个上网用户 用户只要一连接到服务器,则立刻分配一个Session给用户 Session主要方法: 1 服务器上通过Session来分别不同的用户-->Se ...
- cookie 百科_Cookie和session应该这样理解
前言 虽然在学习服务器端语言的时候屡屡提到了Cookie和session这两个概念,有关Cookie和Session的接口也调用过,但始终对实现交互机制和这两者区别的理解感觉是云里雾里,于是打算静下心 ...
最新文章
- Ubuntu14.04 x64 zabbix 3.0 安装
- sql server 字符串转table
- JScript 和 VBscript访问网络上的打印设备
- linux下cpu opencl加速,GPU挑战CPU!详解CUDA+OpenCL威力
- x·dy+y²·sinx·dx=0
- springboot 不使用 thymeleaf_springboot 使用swagger 不显示basic-error-controller解决
- 第一章 Javscript的数据类型
- 6 EDA技术实用教程【基础知识2】
- fluent前处理——gambit边界设置
- wx.getStorage异步和wx.getStorageSync同步区别
- 微信小程序tabBar闪烁问题
- photoshop----剪切蒙版/置入图片
- php ueditor mysql_PHP Ueditor 富文本编辑器
- 2018年Linux发行版颜值排行榜发布啦!
- 秋招一个半月流水账+招银网路科技offer
- RJS参考之JavaScriptCollectionProxy
- SPSS--回归-多元线性回归模型案例解析!(一)
- 9 项目资源管理 人人都是项目经理系列(第9/13篇)
- SFM4300流量传感器应用笔记
- 外呼系统APP外呼软件手机电销软件拨号销售软件功
热门文章
- IDEA Java 死锁 解决死锁状态的三种方法
- DNS服务器的作用 路由器的功能,dns服务器是什么意思 dns服务器主要功能有哪些...
- 如何做华为云服务器迁移?
- 云-移动手机端项目总结
- 四川师范大学人文地理(7-13章)95分版本提纲
- java将大写数字转换成小写并输出
- Android监听消息(二)——电话及短信监听
- 足球视频AI(五)——球员与球的对象跟踪
- Android自定义View之图形图像(模仿360的刷新球自定义一个SeekBar)
- 马悦凌:从初级护士到“民间奇医”[1]