`
shiqidide
  • 浏览: 64434 次
文章分类
社区版块
存档分类
最新评论

httpsession 权限控制 创建销毁过程

 
阅读更多

转自:http://www.iteye.com/topic/960652

最近在做登录和权限控制模块,用到了session,发现session的好多方法都不熟悉,而且以前也听说过JsessionId 之类session窃取的事,对这些一直都是一知半解。今天索性google了很多资料,先上sun的官网去看session的文档了解一些方法,又找了别人关于session的看法。

总结如下:

1,session是什么? what

session经常译为会话,以打电话为例,从开始拨号到挂断电话就是你会话的生存周期。

2,session 做什么用的 why?

首先举个例子:

咖啡店举行 消费满5杯咖啡赠送一杯的活动,可每个人一次消费5杯的时候非常少。这时候有3种办法:

1,店员看到每个顾客时都能记住其消费了多少杯,从而给其优惠,这是协议本身具有状态

2,给每个顾客一个卡片,上面记录顾客的每次消费,这是客户端保存状态

3,给每个顾客一个卡片,卡片上只有一个编号,顾客每次的消费记录在店里,这就是 服务端有状态

而http本身是无状态的,所以我们只能使用2,3中方法,来保存一些信息。

实际采用的是第3种方法,服务器段保存一次会话所有的信息,并生成一个唯一的id,这个id没有规律而且不会重复,将这个id传回到客户段,保存到cookie中。每次访问服务器时,客户端都会偷偷将这个id传到服务器,服务器根据id查到这次会话保存的内容。就能实现会话中共享一些数据。

3,session怎样创建和销毁 ? how

session是保存在内存中的,所以会有一些性能上的影响。因此本着这个原则,session是只有在使用到的时候才会被创建,如果始终没有用到session,这个session是永远不会被创建的。

比如: 访问servlet ,只要你代码中没有 request.getSession()或request.getSession(true);这两行是等价的,那session是不会创建。又 当你访问静态页面时,根本不会生成servlet,所以也不会创建session。

下面解释一些疑惑: session是第一次请求时创建的?

大家都知道 jsp是被编译成servlet才执行的,问题就在jsp编译的过程。

jsp中有个<%@ page session="true/false"%> 这个开关表示是否创建session,当你不写这行时,它会默认给你加上这句。所以会造成上面的疑惑。当然还有一些标签中可能有getSession()操作,会产生一些不必要的session。

session只能在服务端销毁,有三种途径: 1,到达session的最大请求间隔时间时,2,session。invalidate()

3,服务器进程当掉。

这里也有一些疑惑: 浏览器关闭时,session就会注销。

首先浏览器关闭时,浏览器并没有给服务器发送任何消息,所以服务器不会知道浏览器何时关闭了。

上面我们知道取得session 是因为浏览器cookie中有sessionid,而普通cookie通常会是会话cookie,也就是说浏览器关闭时,这个cookie会被注销,所以当你再访问服务器时就没有sessionid了,所以造成session关闭了的假象,如果昵称通过特殊方法将sessionid传递给服务器,你会发现session还在。

如果想让cookie保存时间长一些,就需要手动指定cookie的过期时间

4,实际项目中的难点:

1,浏览器禁用cookie

这就没办法保存sessionid了,可以采用url重写,转发,加隐藏字段等方法来将sessionid传给服务器。

如: baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf

baidu.com?jsessionid=asdfasdfasdfadsfad&&adfdf

这根据服务器的不同实现,第一种可以将普通参数区分开。

2,多人共用session的问题

例: a 访问 baidu.com ,但他没有帐号,于是他将连接 baidu.com/login.jsp?jsessionid=adsfasdfad(这个a的sessionid)发给B, B登录后,a就相当于用b的帐号登录了。你们可以在在本地试试。

解决方法: 当发现通过sessionid从url指定时, 创建一个新的session,将旧session的信息复制到 新sessoin中,然后将新session注销。就能防止上面那种情况了。

3,一个帐号多地方登录

比如: 你用abc帐号登录了baidu.com,有打开了一个浏览器,又用abc帐号登录了一次。当不设计敏感操作时,这无所谓,而当你做一些敏感操作时就必须禁止这样情况,防止同时操作,造成重复操作,或者数据损坏。

解决方法: 监听session,将username和sessionid对应起来,当username再次登录时,注销掉以前的session,保存现在的session,这也是一种比较不错的方案。

这是sghcel画的图,挺不错的:


分享到:
评论

相关推荐

    Spring boot整合 Shiro实现RBAC权限控制

    本项目基于Spring,整合Apache Shiro框架,实现用户管理和权限控制,主要内容如下: 1.登录(带验证码),包括“记住我”的功能; 2.加密,存储的密码不采用明文,初始密码123; 3.session管理:使用shiro默认的...

    httpSession

    NULL 博文链接:https://eggbucket.iteye.com/blog/1350360

    spring websocket获取httpsession

    spring4+ websocket获取httpsession

    HttpSession的使用

    有助于学习,有助于学习JDBC技术,帮助我们在学习中理解接口和类等,以及多个接口的 作用

    httpsession实现验证码登录小实例

    应用httpsession实现一个简单的验证码登录小实例,其中验证码生成工具代码可以积累使用

    Servlet监听器在基于移动Web在线考试系统中的应用.pdf

    Servlet监听器是Servlet规范中定义的一种特殊类,用于监听Web应用程序中的ServletContext、HttpSession和ServletRequest等域对象的创建与销毁事件,以及这些域对象的属性发生修改的事件。在基于移动Web在线考试系统...

    Web应用安全:HTTPSession.pptx

    HTTP 会话的生命周期是指从创建到销毁的整个过程。HTTP 会话的生命周期可以通过设置 Session 的存活时间来控制。默认情况下,Session 的存活时间是 30 分钟。 HTTP 会话是一种重要的 Web 应用安全技术,用于维护...

    利用HttpSession实现Ajax请求重定向.docx

    利用HttpSession实现Ajax请求重定向

    ServletHttpSession DEMO

    ServletHttpSession DEMO

    servlet-api.jar 适用于import javax.servlet.http.HttpSession;异常

    servlet-api.jar 适用于import javax.servlet.http.HttpSession;异常 直接下载后直接导入 即可,

    WebSocket区分不同客户端两种方法(HttpSession和@PathParam)

    WebSocket区分不同客户端两种方法(HttpSession和@PathParam)

    在WebSphereApplicationServerV7集群环境中管理HTTPsession.pdf

    在WebSphereApplicationServerV7集群环境中管理HTTPsession.pdf

    HTTPSession-开源

    HTTPSession将提供一个完整的Java库来管理HTTP客户端会话。 功能(将)包括:cookie管理,HTTP身份验证,引用管理,导航历史记录,刷新语句和HTTP重定向处理。

    Java Web 知识点复习提纲(二)1

    监听器可以监听的事件有三个大作域对象的声明周期,例如:HttpServletRequest 的创建和销毁、HttpSession 的创建和销毁、ServletContext 的创建和销毁。 四、Statement 中可以执行 SQL 命令的三个方法 三个方法都...

    jsp+struts权限管理

    jsp+struts权限管理源代码。 package sunyang.functions.action; import java.util.List; import javax.servlet.http.HttpSession; import org.apache.struts2.ServletActionContext; import sunyang.functions...

    java开发oa系统源码下载-Spring-shiro:Spring整合权限框架Shiro

    5.后台接口权限控制:对后台接口启用权限控制,对应的接口若不满足权限或角色要求,则请求失败; 6.用户-角色-权限使用常规RBAC的模型,用户到角色,角色到权限均为多对多关系映射。 效果图: 附录:中央技术储备...

    jsp内置对象的用法

    exception对象是一个例外对象,当一个页面在运行过程中发生了例外,就产生这个对象。如果一个JSP页面要应用此对象,就必须把isErrorPage设为true,否则无法编译。他实际上是java.lang.Throwable的对象 序号 方 法...

    尚硅谷_javaWEB.docx

    本Java视频教程涵盖JavaWEB 企业级开发所需的Servlet、JSP、MVC 设计模式、EL 表达式、...3.具实战性:授课过程中包含的企业级案例:Cookie 实现浏览信息回显、Filter 实现权限管理、HttpSession 实现验证码登录

    request.getSession().doc

    如果当前会话不存在,可以通过 create 参数控制是否创建一个新的会话对象。 参数解释 * boolean create:如果为 true,则在当前会话不存在时创建一个新的会话对象;如果为 false,则在当前会话不存在时返回 null。...

Global site tag (gtag.js) - Google Analytics