文档章节

对session的一些理解

whaon
 whaon
发布于 2013/03/11 17:06
字数 614
阅读 2046
收藏 18
点赞 0
评论 0

由于HTTP协议的无状态性,我们可以用过cookie和session来标识某个用户,session实际上也是利用cookie来实现的,一般在请求头中看到的JSESSION=一串字符就是,如果客户端禁用了cookie,我们可以用通过url重写的方式来替代cookie

我们再来看一下request.getSession方法的解释

HttpSession getSession(boolean create)
Returns the current HttpSession associated with this request or, if there is no current session and create is true, returns a new session. 
If create is false and the request has no valid HttpSession, this method returns null.
就是说你不可能在一个方法里创建一个新的session来把前面已存在的session覆盖掉,否则session岂不是乱了

一般某个用户登录后,我们会把他的信息存在session里,如:

session.setAttribute("user", true);

而session是由web容器,如tomcat来维护的,容器会为session生成一个唯一ID,该ID可以通过session.getId()方法获得,然后,服务器会把该ID返回给浏览器,类似

Set-Cookie:JSESSIONID=C7328DFC03B54841EA5A11127791CEF5; Path=/SpringSecurityStudy/; HttpOnly
这样,用户访问其他页面时会带上信息,如:
Cookie:JSESSIONID=C7328DFC03B54841EA5A11127791CEF5
这时在服务端,我们就可以通过session.getAttribute("user") == true来判断用户是否登录,而实际上web容器会根据你的JSESSIONID找到对应的session,然后再取得该session的"user"值

session在服务端是有生命周期的,tomcat的话默认是30分钟,当然我们可以进行配置,或者在程序中设置,session在浏览器端是通过内存形式的cookie来存储的,也就是说如果浏览器关闭,该cookie也就消失了,但是在服务端的session不会立即消失,只到超时才会消失

我们可以通过发送请求来通知服务端来使session失效,这便是注销

在SpringSecurity中,我们一般通过

SecurityContextHolder.getContext().getAuthentication().getPrincipal()

来获取当前登录用户

实际上是,用户登录后,会执行以下操作

session.setAttribute("SPRING_SECURITY_CONTEXT", SecurityContext);

SecurityContextHolder.getContext() == session.getAttribute("SPRING_SECURITY_CONTEXT")
所以我们也可以通过
((SecurityContext) session.getAttribute("SPRING_SECURITY_CONTEXT")).getAuthentication().getPrincipal();
来取得用户

所以综上,SpringSecurity也是通过session来判断用户是否登录

值得一提的是,当我们访问JSP页面时,发现始终会有JSESSIONID,通过查看JSP页面生成的servlet会使用

session = pageContext.getSession();

所以一定会有session,这也说明了为什么在JSP页面中可以使用内置对象session


© 著作权归作者所有

共有 人打赏支持
whaon

whaon

粉丝 42
博文 38
码字总数 33114
作品 0
厦门
程序员
php关于对cookie与session的理解

对于cookie的理解: cookie是服务器留给客户端的礼物(小甜点),来完成服务器对用户的身份验证的一种方式 具体的来讲就是,当用户登录服务器的时候有服务器通过setCookie函数在客户端的浏览...

虫虫 ⋅ 2012/03/05 ⋅ 0

spark 大型项目实战(一):用户访问session分析(1) --模块介绍

模块的目标:对用户访问的session 进行分析 1、可以根据使用者指定的某些条件,筛选出指定的一些用户(有特定年龄、职业、城市); 2、对这些用户在指定日期范围内发起的session,进行聚合统...

u012957549 ⋅ 05/12 ⋅ 0

spring-session 存放在redis 失效问题

项目采用spring-session将session保存到redis中。 我有设置session的失效时间 项目启动后访问到登录界面,程序中会存一个session; 我在redis中看到的TTL是1200秒多(spring session的机制默...

天巧星-浪子燕青 ⋅ 06/13 ⋅ 0

ASP.NET页面传值

这个问题是上周去远洋公司面试的一道笔试题,面试的时候面试官也问到了,虽然事先有所准备当时也回答上了,但是从根本上说自己还不太理解。正好这两天做高效平台评教系统的时候用到了页面传值...

邵鸿鑫 ⋅ 2014/12/30 ⋅ 0

Hibernate中SessionFactory的理解(转载)

Session接口   Session接口对于Hibernate 开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目中确实很...

源-代码 ⋅ 2016/05/09 ⋅ 0

解析PHP默认的session_id生成算法

作为一个web程序猿,我们对session肯定都不陌生,session id是我们各自在服务器上的一个唯一标志,这个id串既可以由php自动来生成,也可以由我们来赋予。你们可能和我一样,很关心php自动生成...

yearnfar ⋅ 2014/08/03 ⋅ 0

XMPP的一些工作--续

看来最近这段时间我和xmpp是干上了。今天要写一点关于xmpp pubsub的一些认识。 服务器用openfire3.7.1 我们都知道XMPP pubsub的功能很强大。可以用来完成非常多的功能。正好最近在开发一些服...

ilxlf ⋅ 2011/11/12 ⋅ 0

Django session 详解-part II-session

Django中的session是一个高级工具,它可以让用户存储个人信息以便在下次访问网站中使用这些信息。session的基础还是cookie,但是它提供了一些更加高级的功能。请看下面的一个例子: 使用ses...

岭南六少 ⋅ 2011/08/18 ⋅ 0

Laravel-01-请求和响应对象理解分析

在Laravel里,主要是对请求和响应做了对象化处理,所以要充分理解对象化编程的理念。 获取请求对象 从这里开始要讲Http的请求和响应,要先对http协议进行充分的预习和了解。 在Laravel里,主...

Corwien ⋅ 2016/03/04 ⋅ 0

深入理解 Session 与 Cookie

Session 与 Cookie 的作用都是为了保持访问用户与后端服务器的交互状态。它们有各自的优点,也有各自的缺陷,然而具有讽刺意味的是它们的优点和它们的使用场景又是矛盾的。例如,使用 Cookie...

Kevin-air ⋅ 2014/01/14 ⋅ 3

没有更多内容

加载失败,请刷新页面

加载更多

下一页

解决CentOS6、7,/etc/sysconfig/下没有iptables的问题

一、Centos 6版本解决办法: 1.任意运行一条iptables防火墙规则配置命令: iptables -P OUTPUT ACCEPT 2.对iptables服务进行保存: service iptables save 3.重启iptables服务: service ...

寰宇01 ⋅ 25分钟前 ⋅ 2

数据库备份和恢复

备份:mysqldump -u root -p 数据库>磁盘路径 恢复:mysql -u root -p 数据库<sql脚本的磁盘路径

anlve ⋅ 今天 ⋅ 0

发生了什么?Linus 又发怒了?

在一个 Linux 内核 4.18-rc1 的 Pull Request 中,开发者 Andy Shevchenko 表示其在对设备属性框架进行更新时,移除了 union 别名,这引发了 Linus 的暴怒。 这一次 Linus Torvalds 发怒的原...

问题终结者 ⋅ 今天 ⋅ 0

在树莓派上搭建一个maven仓库

在树莓派上搭建一个maven仓库 20180618 lambo init 项目说明 家里有台树莓派性能太慢。想搭建一个maven私服, 使用nexus或者 jfrog-artifactory 运行的够呛。怎么办呢,手写一个吧.所在这个...

林小宝 ⋅ 今天 ⋅ 0

Spring发展历程总结

转自与 https://www.cnblogs.com/RunForLove/p/4641672.html 目前很多公司的架构,从Struts2迁移到了SpringMVC。你有想过为什么不使用Servlet+JSP来构建Java web项目,而是采用SpringMVC呢?...

onedotdot ⋅ 今天 ⋅ 0

Python模块/包/库安装(6种方法)

Python模块/包/库安装(6种方法) 冰颖机器人 2016-11-29 21:33:26 一、方法1: 单文件模块 直接把文件拷贝到 $python_dir/Lib 二、方法2: 多文件模块,带setup.py 下载模块包(压缩文件zip...

cswangyx ⋅ 今天 ⋅ 0

零基础学习大数据人工智能,学习路线篇!系统规划大数据之路?

大数据处理技术怎么学习呢?首先我们要学习Python语言和Linux操作系统,这两个是学习大数据的基础,学习的顺序不分前后。 Python:Python 的排名从去年开始就借助人工智能持续上升,现在它已经...

董黎明 ⋅ 今天 ⋅ 0

openJdk和sun jdk的区别

使用过LINUX的人都应该知道,在大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的OpenJDK, 那么到底什么是OpenJDK,它与SUN JDK有什么关系和区别呢? 历史上的原因是,Ope...

jason_kiss ⋅ 今天 ⋅ 0

梳理

Redux 是 JavaScript 状态容器,提供可预测化的状态管理。 它是JS的状态容器,是一种解决问题的方式,所以即可以用于 react 也可以用于 vue。 需要理解其思想及实现方式。 应用中所有的 stat...

分秒 ⋅ 今天 ⋅ 0

Java 后台判断是否为ajax请求

/** * 是否是Ajax请求 * @param request * @return */public static boolean isAjax(ServletRequest request){return "XMLHttpRequest".equalsIgnoreCase(((HttpServletReques......

JavaSon712 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部