如何防止session超时简单实用的方法-添加心跳功能
- 格式:doc
- 大小:21.50 KB
- 文档页数:2
PHP设置会话(Session)超时过期时间实现登录时间限制
最近某个PHP项⽬⽤到了限制登录时间的功能,⽐如⽤户登录系统60分钟后如果没有操作就⾃动退出,我搜索了⽹络收集了有以下⽅法可供参考。
第⼀种⽅法即设置php.ini配置⽂件,设置session.gc_maxlifetime和session.cookie_lifetime节点属性值,当然也可以使⽤ini_set函数改变当前上下⽂环境的属性值:
ini_set('session.gc_maxlifetime', "3600"); // 秒
ini_set("session.cookie_lifetime","3600"); // 秒
第⼆种⽅法即设置Session时间戳,⽐如下⾯的办法。
在登录成功时设置时间戳为当前时间推后1⼩时,$_SESSION['expiretime'] = time() + 3600;。
在检查⽤户登录情况使⽤如下代码:
if(isset($_SESSION['expiretime'])) {
if($_SESSION['expiretime'] < time()) {
unset($_SESSION['expiretime']);
header('Location: logout.php?TIMEOUT'); // 登出
exit(0);
} else {
$_SESSION['expiretime'] = time() + 3600; // 刷新时间戳
}
}。
Session的有效期设置⽅式⼀:在web.xml中设置session-config如下:<session-config><session-timeout>2</session-timeout></session-config>即客户端连续两次与服务器交互间隔时间最长为2分钟,2分钟后session.getAttribute()获取的值为空API信息:session.getCreationTime() 获取session的创建时间session.getLastAccessedTime() 获取上次与服务器交互时间session.getMaxInactiveInterval() 获取session最⼤的不活动的间隔时间,以秒为单位120秒。
<!-- 登录状态过滤,可以过滤掉不需要进⾏超时验证的url --><filter><filter-name>loginFilter</filter-name><filter-class>com.software.filter.LoginFilter</filter-class></filter><filter-mapping><filter-name>loginFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!---以上代码指明具体的路径,具体的代码见附录>⽅式⼆:在Tomcat的/conf/web.xml中session-config,默认值为:30分钟<session-config><session-timeout>30</session-timeout></session-config>⽅式三:在Servlet中设置HttpSession session = request.getSession();session.setMaxInactiveInterval(60);//单位为秒说明:1.优先级:Servlet中API设置 > 程序/web.xml设置 > Tomcat/conf/web.xml设置2.若访问服务器session超时(本次访问与上次访问时间间隔⼤于session最⼤的不活动的间隔时间)了,即上次会话结束,但服务器与客户端会产⽣⼀个新的会话,之前的session⾥的属性值全部丢失,产⽣新的sesssionId3.客户端与服务器⼀次有效会话(session没有超时),每次访问sessionId相同,若代码中设置了session.setMaxInactiveInterval()值,那么这个session的最⼤不活动间隔时间将被修改,并被应⽤为新值。
Session过期问题处理在应⽤中,很多⼈会遇到Session过期设置有冲突。
其中,可以有四处设置Session的过期时间:⼀、全局⽹站(即服务器)级IIS-⽹站-属性--编辑配置-状态管理-会话超时(分钟)-设置为120,即为2⼩时,即120分钟后如果当前⽤户没有操作,那么Session就会⾃动过期。
⼆、⽹站级IIS-⽹站-具体⽹站(如DemoSite)-属性-,此时有两个选项,⼀个是“编辑全局配置”,⼀个是“编辑配置”。
如果“编辑全局配置”,就和上个配置⼀样。
如果“编辑配置”,则只对当前⽹站⽣效。
因为⼀个服务器可能有很多独⽴⽹站。
1、继续选择“状态管理”-会话超时(分钟)-设置为360,即360分钟。
效果同上,只不过只对当前⽹站⽣效。
2、⾝份认证-Forms-Cooke超时,选择"12:00:00",即12个⼩时。
可选项共有以下⼋项:00:15:0000:30:0001:00:0002:00:0004:00:0008:00:0012:00:001:00:00:00即最长24⼩时,最⼩15分钟。
这是默认的配置。
在应⽤中可以⾃由定制。
三、应⽤程序级同⽹站管理,只不过作⽤域仅限当前应⽤程序。
四、页⾯级在某页⾯中,设置Session.Timeout = 30;即可临时修改某页⾯的会话过期时间。
查看某个Session的过期时间,可以⽤TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);TimeSpan SessTimeOut = new TimeSpan(0, 0, System.Web.HttpContext.Current.Session.Timeout, 0, 0);其中,⼆和三的设置,体现在Web.config中即:<?xml version="1.0"?><configuration><system.web><authentication mode="Forms"><forms name="AuthLogin" loginUrl="/Login.aspx" protection="All" timeout="360" slidingExpiration="true"/></authentication><sessionState mode="InProc" cookieless="false" timeout="20"/></system.web><location path="Login.aspx"><system.web><authorization><allow users="*"/></authorization></system.web></location></configuration>以上四处设置的优先级为页⾯级>应⽤程序级>⽹站级>服务器级。
session了解及超时处理Session了解Session是什么引⾔在web开发中,session是个⾮常重要的概念。
在许多动态⽹站的开发者看来,session就是⼀个变量,⽽且其表现像个⿊洞,他只需要将东西在合适的时机放进这个洞⾥,等需要的时候再把东西取出来。
这是开发者对session最直观的感受,但是⿊洞⾥的景象或者说session内部到底是怎么⼯作的呢?当笔者向⾝边的⼀些同事或朋友问及相关的更进⼀步的细节时,很多⼈往往要么含糊其辞要么主观臆断,所谓知其然⽽不知其所以然。
笔者由此想到很多开发者,包括我⾃⼰,每每都是纠缠于框架甚⾄⼆次开发平台之上,⽽对于其下的核⼼和基础知之甚少,或者有⼼⽆⼒甚⾄毫不关⼼,少了逐本溯源的精神,每忆及此,⽆不惭愧。
曾经实现过⼀个简单的HttpServer,但当时由于知识储备和时间的问题,没有考虑到session这块,不过近期在⼯作之余翻看了⼀些资料,并进⾏了相关实践,⼩有所得,本着分享的精神,我将在本⽂中尽可能全⾯地将个⼈对于session的理解展现给读者,同时尽我所能地论及⼀些相关的知识,以期读者在对session有所了解的同时也能另有所悟,正所谓授⼈以渔。
Session是什么Session⼀般译作会话,⽜津词典对其的解释是进⾏某活动连续的⼀段时间。
从不同的层⾯看待session,它有着类似但不全然相同的含义。
⽐如,在web应⽤的⽤户看来,他打开浏览器访问⼀个电⼦商务⽹站,登录、并完成购物直到关闭浏览器,这是⼀个会话。
⽽在web应⽤的开发者开来,⽤户登录时我需要创建⼀个数据结构以存储⽤户的登录信息,这个结构也叫做session。
因此在谈论session的时候要注意上下⽂环境。
⽽本⽂谈论的是⼀种基于HTTP协议的⽤以增强web应⽤能⼒的机制或者说⼀种⽅案,它不是单指某种特定的动态页⾯技术,⽽这种能⼒就是保持状态,也可以称作保持会话。
为什么需要session谈及session⼀般是在web应⽤的背景之下,我们知道web应⽤是基于HTTP协议的,⽽HTTP协议恰恰是⼀种⽆状态协议。
session过期时间设置说明一.系统session配置说明针对承保(prpall)、双核(undwrt)系统中,有两个配置文件可以设置session的过期时间分别是web.xml和weblogic.xmlWeb.xml中配置<session-config><session-timeout>60</session-timeout></session-config>时间单位是一分钟,并且只能是整数,如果是零或负数,那么会话就永远不会超时。
此例表示Session将在60分钟后过期weblogic.xml中设置的TimeoutSecs属性值。
Weblogic.xml中配置<session-param><param-name>TimeoutSecs</param-name><param-value>1800</param-value></session-param>时间单位是一秒钟,表示1800秒后失效。
1.如果两个配置文件中都有配置,且Weblogic.xml中配置的秒数必须可以被60整除,(如60,120等)。
则按照时间最小的那个为准。
2.如果两个配置文件中都有配置,且Weblogic.xml中配置的秒数必须不可以被60整除(如,45,90等)。
则以web.xml设置的时间为准。
3.如果web.xml文件中没有设置,且Weblogic.xml中有配置。
则按照Weblogic.xml 的设置为准。
4.为保证session的唯一性,在weblogic环境下,建议只在weblogic.xml中设置。
防止出现冲突。
二.疑问1.web.xml,weblogic.xml同时配置时,为什么会是以时间小的为准?暂时无解。
2.对应的weblogic.xml 必须配置为分钟的整数倍?如web=2m weblogic=90s,最终为以web为准。
session超时Session超时一、介绍当用户在网站或应用程序上进行登录后,服务器会为其分配一个唯一的会话ID。
该会话ID通常会在一段时间内保持有效,以便用户可以在一段时间内持续使用网站或应用程序而无需重新登录。
然而,由于诸多因素的影响,会话可能会在一段时间后过期,这就被称为会话超时或session超时。
会话超时可以是网站或应用程序设计的一种安全策略来保护用户的隐私和减少资源的浪费。
二、原因1. 长时间不活动:如果用户在一段时间内没有与服务器进行任何交互活动,服务器通常会主动终结该会话,以防止未经授权访问。
2. 安全性考虑:在某些情况下,会话超时可以作为一种安全性措施,以减少未经授权访问的可能性。
例如,当用户忘记注销时,超时会话可以防止他人访问用户的帐户。
3. 资源管理:对于拥有大量同时在线用户的网站或应用程序,会话超时可以帮助减少服务器资源的消耗。
通过释放长时间不活动用户的会话,可以为其他活跃用户腾出资源,以提高系统的整体性能。
三、设置会话超时时间会话超时时间的设置因网站或应用程序的需求而异。
以下是设置会话超时时间的一些常见方法:1. 配置文件设置:大多数网站或应用程序会将会话超时时间配置在其相应的配置文件中。
通过更改配置文件中的参数,管理员可以轻松地调整会话超时时间。
2. 代码设置:网站或应用程序的开发人员可以在其代码中显式设置会话超时时间。
这通常会在用户登录后的关键位置进行设置。
3. 服务器设置:某些服务器允许管理员直接在服务器级别设置会话超时时间。
这种设置是全局的,适用于服务器上的所有网站或应用程序。
四、会话超时对用户的影响会话超时可能对用户造成以下影响:1. 需要重新登录:一旦会话超时,用户可能需要重新输入他们的凭据和登录信息以继续访问网站或应用程序。
这可能会导致用户的不便和时间浪费。
2. 丢失数据:如果用户在会话超时之前没有保存他们的工作或数据,那么这些数据可能会丢失。
这可能对用户造成困扰,特别是在他们进行了复杂的操作或提交了重要的信息时。
设置Session永不过期,Session有效时间的问题保持Session的方法:有人说设session.timeout=-1,或小于0的数。
这种方法肯定是不行的,session计算时间以分钟为单位,必须是大于等于1的整数。
又有人说设session.timeout=99999。
这种同样不行,session有最大时间限制。
我经过测试发现最大值为24小时,也就是说你最大可以session.timeout=1440,1441都是不可以有,呵呵。
本人测试环境:win2003+IIS6.0+ASP3.0。
所以想通过设session.timeout的过期时间让session永不过期是不可能的。
写到Cookies里是比较好的方法,网上也有很多这样的教程,这里就不再说了!还有就是用在要保持session的页里设隐藏iframe每隔一段时间(这个时间小于session.timeout的时间)把刷新一次frame里的空页面!实现方法如下:在要保持session页里加上:<iframe width=0 height=0src="/blog/SessionKeeper.asp"></iframe>同目录下建一下SessionKeeper.asp的文件。
<html><head><meta http-equiv="Refresh"content="900000;url=sessionKeeper.asp"><!--每隔900秒刷新一下自己,为了和服务器通讯一下,保持session不会丢--></head></html>这种方法还是比较长见的,另外还有一种和上面类似的方法,不过他不是用meta自动刷新嵌套的iframe的方法。
springboot2以上版本设置session超时时间
在springboot2.0之后,设置session超时的⽅式修改为在application.yml或application.xml上⾯添加
server.servlet.session.timeout=DT1M
PT1M 意思是设置session失效的时间是1分钟。
扩展:Duration
通过查看springboot源码发现setTimeouot⽅法,这⾥要求传⼊Duration的实例
public void setTimeout(Duration timeout) {
this.timeout = timeout;
}
⽽Duration是在Java8中新增的,主要⽤来计算⽇期差值,Duration是被final声明的,并且是
线程安全的
转换字符串⽅式,类似于 SimpleDateFormat 的格式化⽇期⽅式
Duration 字符串类似数字有正负之分,默认正,负以’-‘开头,紧接着’P’,下⾯所有字母都不区分⼤
⼩写:
‘D’ – 天
‘H’ – ⼩时
‘M’ – 分钟
‘S’ – 秒
字符’T’是紧跟在时分秒之前的,每个单位都必须由数字开始,且时分秒顺序不能乱,⽐
如:P2DT3M5S,P3D,PT3S
PT3M2S 等于 -PT-3M-2S
最后总结⼀下Duration最实⽤的⼀个功能其实是 between ⽅法,因为有很多时候我们需要计
算两个⽇期之间的天数或者⼩时数,⽤这个就可以很⽅便的进⾏操作。
防止sesssion过期超时添加心跳
有时候大家不希望session过一会提示session超时
还需要重新登录
下面给大家介绍个简单方法:添加心跳的方法
1.在公用页面中添加:
<iframe id='member_topjump'
src='${pageContext.request.contextPath}/jsp/backend.jsp' style='disp lay:none'></iframe>
一般都是向top类似的页面中或public.jsp那样页面中添加
2.backend.jsp' 源码很简单:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="/1999/xhtml">
<head>
<title>Comet php backend</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="Cache-Control" CONTENT="no-store"/>
<meta http-equiv="Pragram" CONTENT="no-cache"/>
<meta http-equiv="Expires" CONTENT="no-store"/>
<meta http-equiv="Refresh" CONTENT="300"/>
</head>
<body>
<%
out.println("<script type=\"text/javascript\">");
out.println ("</script>");
//System.out.println("----------------------"+(System.currentTimeMi llis()/1000));
out.flush(); // used to send the echoed data to the client
%>
</body>
</html>。