- 浏览: 197338 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
moonskyii:
基于flex 和red5的视频聊天 -
yilinhust:
abc.html中有相关字体CSS吗?font.addFont ...
html 生成 pdf 实现思路和代码,基于itext -
feiyan35488:
好久不用ftl了,发现jsp其实还是蛮强大的
freemarker 源码分析 -
elliotann:
呵呵,我也是
freemarker 源码分析 -
lai555:
单步调试呢?
抛开myeclipse ,使用maven jetty 插件运行调试 web项目
最近在做登录和权限控制模块,用到了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 画的图,挺不错的:
评论
图画的非常不错
这个map可以保存到 servletContext中。清理session的时候,需要注册session的listener,有session销毁的操作时,就可以清除了。当对方关闭浏览器时,只能等session到期自动销毁。这就需要将session的最大请求间隔时间设计的合理一些
这个Map 要不要做成static的?
这个不用,放到servletContext中就可以了,用不到设计成static,否则需要用线程安全的map,这样查询和插入很浪费性能的
ServletContext是Servlet的上下文环境类,为什么要放到这里?
HttpSessionListener和HttpSessionActivationListener是监听Session对象的创建和销毁。当创建一个Session时,激发HttpSessionListener中的session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发HttpSessionListener中的sessionDestroyed (HttpSessionEvent se)方法。
所以说应该放到HttpSessionListener中。(用子类去实现这个接口,然后通过HttpSessionEvent.getSession().getId()去获得sessionId)
1,浏览器禁用cookie
这就没办法保存sessionid了,可以采用url重写,转发,加隐藏字段等方法来将sessionid传给服务器。
如: baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf
baidu.com?jsessionid=asdfasdfasdfadsfad&&adfdf
这根据服务器的不同实现,第一种可以将普通参数区分开。
纠正
baidu.com;jsessionid=adfasdfasdfasdfasdfafdadf
而不是
baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf
";"表示jsessionid作为uri请求的一部分信息
"?"不应该作为请求参数的一部分传递到服务端
嗯 对。
1,浏览器禁用cookie
这就没办法保存sessionid了,可以采用url重写,转发,加隐藏字段等方法来将sessionid传给服务器。
如: baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf?asdfasdf
baidu.com?jsessionid=asdfasdfasdfadsfad&&adfdf
这根据服务器的不同实现,第一种可以将普通参数区分开。
纠正
baidu.com;jsessionid=adfasdfasdfasdfasdfafdadf
而不是
baidu.com:jsessionid=adfasdfasdfasdfasdfafdadf
";"表示jsessionid作为uri请求的一部分信息
"?"不应该作为请求参数的一部分传递到服务端
这个map可以保存到 servletContext中。清理session的时候,需要注册session的listener,有session销毁的操作时,就可以清除了。当对方关闭浏览器时,只能等session到期自动销毁。这就需要将session的最大请求间隔时间设计的合理一些
这个Map 要不要做成static的?
这个不用,放到servletContext中就可以了,用不到设计成static,否则需要用线程安全的map,这样查询和插入很浪费性能的
这个map可以保存到 servletContext中。清理session的时候,需要注册session的listener,有session销毁的操作时,就可以清除了。当对方关闭浏览器时,只能等session到期自动销毁。这就需要将session的最大请求间隔时间设计的合理一些
这个Map 要不要做成static的?
然后将新的session注销?!
笔误 将旧的session注销
然后将新的session注销?!
有一个叫监听器的东西
目前没有非常好的解决办法,可以做些努力的操作是,在页面上注册 window.onclose 事件,当页面关闭时向服务器发送logout请求,就可以清理session了。至于直接kill 浏览器进程,没有解决办法。只能等待session自动销毁
发表评论
-
ThreadLocal 学习
2011-03-21 18:17 802ThreadLocal 是线程内部变量,以空间换时间的做法,将 ... -
jstl 标签
2011-03-10 21:55 956核心标签库 它是JSTL中的核心库,为日常任务提供 ... -
项目中遇到的一些问题记录
2011-02-14 15:39 10001,项目无法连接数据库, can't open connect ... -
ioc 容器中进行 事务管理
2011-01-21 21:43 842spring中进行事务管理,是使用了动态代理技术,为 拦截的b ... -
java项目 异常处理 机制
2011-01-20 17:05 1032项目中 发现有好多异常需要检查处理,老大要求有异常直接抛出,不 ... -
gae 数据存储的 jpa 说明
2011-01-19 22:39 1194将 JDO 与 App Engine 配合使用 Java ... -
gae 数据存储区 的 事务说明
2011-01-19 22:36 966事务 App Engine 数据存 ... -
gae 数据存储的 索引说明
2011-01-19 22:34 1016引入索引 App Engine 数据存储区会为应用程序要 ... -
gae 数据存储的 查询说明
2011-01-19 22:34 1299查询和索引 每个数据存储区查询都使用一个索引,即包含按指 ... -
filter 的执行顺序
2011-01-12 15:33 1032我记得是按 filter-mapping的顺序来执行的, 心里 ... -
java reflect 系列1
2010-12-23 14:24 675class Dog{ privat ... -
timer 计时器的使用
2010-10-27 11:52 794等等 一会出 -
抓取网页
2010-10-22 10:51 1028public static String getHtml ... -
eclipse 下安装插件
2010-09-21 11:50 894从别人那里搞的eclipse的安装tips Eclipse的插 ... -
在eclipse中安装velocity编辑器、Freemarker编辑器
2010-09-19 12:58 4985记录以便今后 ... -
jsp el 表达式介绍
2010-09-14 16:52 889JSP EL简介 语 法结构 ${ex ... -
html 动态引入 其他文件
2010-09-14 16:46 1054<!-- #include PathType = Fil ... -
ssi server side include
2010-09-14 16:46 11411.简介: SSI全称(Server Side In ... -
java学习笔记1
2009-11-03 22:16 845java JDK 的安装就不说了,主要是安装完成后配置JAV ...
相关推荐
NULL 博文链接:https://eggbucket.iteye.com/blog/1350360
spring4+ websocket获取httpsession
有助于学习,有助于学习JDBC技术,帮助我们在学习中理解接口和类等,以及多个接口的 作用
应用httpsession实现一个简单的验证码登录小实例,其中验证码生成工具代码可以积累使用
利用HttpSession实现Ajax请求重定向
servlet-api.jar 适用于import javax.servlet.http.HttpSession;异常 直接下载后直接导入 即可,
ServletHttpSession DEMO
WebSocket区分不同客户端两种方法(HttpSession和@PathParam)
Web应用安全:HTTPSession.pptx
在WebSphereApplicationServerV7集群环境中管理HTTPsession.pdf
HTTPSession将提供一个完整的Java库来管理HTTP客户端会话。 功能(将)包括:cookie管理,HTTP身份验证,引用管理,导航历史记录,刷新语句和HTTP重定向处理。
详细题目描述可参照博客内文章。。。。。。。。。。。。。。。。。。。。。
第九章 状态管理-Cookie9.1 状态管理概述9.1.1 为什么需要状态管理9.1.2 什么是状态管理9.1.3 状态管理的两种常见模式1、写出HTTPSe
实现了HttpUrlConnetion在获取验证码后保持Session登陆的一个实例.更多好看的博客请访问我的博客:http://blog.sina.com.cn/u/2622426745
主要介绍了java使用HttpSession实现QQ的访问记录的相关资料,需要的朋友可以参考下
sevletapi.jar JavaEE开发用的jar包
主要介绍了JavaWeb中HttpSession中表单的重复提交,非常不错,具有参考借鉴价值,需要的朋友可以参考下
主要介绍了java使用websocket,并且获取HttpSession,通过使用配置源码分析了各方面知识点,具体操作步骤大家可查看下文的详细讲解,感兴趣的小伙伴们可以参考一下。
2 HttpSession getSession() 返回当前页中的HttpSession对象(session) 3 Object getPage() 返回当前页的Object对象(page) 4 ServletRequest getRequest() 返回当前页的ServletRequest对象(request) 5 Servlet...