session过期时间设置
- 格式:docx
- 大小:15.94 KB
- 文档页数:4
SpringBoot2.x设置Session失效时间及失效跳转1 #Session超时时间设置,单位是秒,默认是30分钟2 server.servlet.session.timeout=10然⽽并没有什么⽤,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个1private long getSessionTimeoutInMinutes() {2 Duration sessionTimeout = this.getSession().getTimeout();3return this.isZeroOrLess(sessionTimeout) ? 0L : Math.max(sessionTimeout.toMinutes(), 1L);4 }如果说某些⼈看不懂 Duration 这个类是什么,我不推荐你接着看下去了,因为没有什么帮助。
⒈Session失效后如何跳转到Session失效地址1package cn.coreqi.security.config;23import cn.coreqi.security.Filter.SmsCodeFilter;4import cn.coreqi.security.Filter.ValidateCodeFilter;5import org.springframework.beans.factory.annotation.Autowired;6import org.springframework.context.annotation.Bean;7import org.springframework.context.annotation.Configuration;8import org.springframework.security.config.annotation.web.builders.HttpSecurity;9import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;10import org.springframework.security.crypto.password.NoOpPasswordEncoder;11import org.springframework.security.crypto.password.PasswordEncoder;12import org.springframework.security.web.authentication.AuthenticationFailureHandler;13import org.springframework.security.web.authentication.AuthenticationSuccessHandler;14import ernamePasswordAuthenticationFilter;1516 @Configuration17public class WebSecurityConfig extends WebSecurityConfigurerAdapter {1819 @Autowired20private AuthenticationSuccessHandler coreqiAuthenticationSuccessHandler;2122 @Autowired23private AuthenticationFailureHandler coreqiAuthenticationFailureHandler;2425 @Autowired26private SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig;2728 @Bean29public PasswordEncoder passwordEncoder(){30return NoOpPasswordEncoder.getInstance();31 }323334 @Override35protected void configure(HttpSecurity http) throws Exception {36 ValidateCodeFilter validateCodeFilter = new ValidateCodeFilter();37 validateCodeFilter.setAuthenticationFailureHandler(coreqiAuthenticationFailureHandler);3839 SmsCodeFilter smsCodeFilter = new SmsCodeFilter();404142//http.httpBasic() //httpBasic登录 BasicAuthenticationFilter43 http.addFilterBefore(smsCodeFilter, UsernamePasswordAuthenticationFilter.class) //加载⽤户名密码过滤器的前⾯44 .addFilterBefore(validateCodeFilter, UsernamePasswordAuthenticationFilter.class) //加载⽤户名密码过滤器的前⾯45 .formLogin() //表单登录 UsernamePasswordAuthenticationFilter46 .loginPage("/coreqi-signIn.html") //指定登录页⾯47//.loginPage("/authentication/require")48 .loginProcessingUrl("/authentication/form") //指定表单提交的地址⽤于替换UsernamePasswordAuthenticationFilter默认的提交地址49 .successHandler(coreqiAuthenticationSuccessHandler) //登录成功以后要⽤我们⾃定义的登录成功处理器,不⽤Spring默认的。
php中实现精确设置session过期时间的⽅法⼤多数据情况下我们对于session过期时间使⽤的是默认设置的时间,⽽对于⼀些有特殊要求的情况下我们可以设置⼀下session过期时间。
对此,可以在PHP中,设置php.ini,找到session.gc_maxlifetime = 1440 #(PHP5默认24分钟)这⾥你可以随便设置⼀下过期时间.但是有⼈说设置以后,好象不起作⽤!其实不是不起作⽤,⽽是因为系统默认:session.gc_probability = 1session.gc_divisor = 1000garbage collection 有个概率的,1/1000就是session 1000次才有⼀次被回收。
只要你的访问量⼤了,那就能达到回收的效果.或者你也可以设置⼀下session.gc_divisor 的值,⽐如:session.gc_divisor = 1,这样就能明显的看到SESSION过期的效果了.我们最常⽤的是在php程序中设置,如下例程序所⽰:<?phpif(!isset($_SESSION['last_access'])||(time()-$_SESSION['last_access'])>60)$_SESSION['last_access'] = time();>这样就搞定了,如果要设置已过期的话也可以在程序中实现:<?phpunset($_SESSION['last_access']);// 或 $_SESSION['last_access']='';>session有过期的机制:session.gc_maxlifetime 原来session 过期是⼀个⼩概率的事件,分别使⽤session.gc_probability和session.gc_divisor 来确定运⾏session 中gc 的概率 session.gc_probability和session.gc_divisor的默认值分别为 1和100。
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的方法在Web开发中,Session是一种存储在服务器端的一组数据,可以通过客户端的Cookie或URL参数进行访问。
一般来说,Session 会在用户登录时创建,用于存储用户的登录信息和相关状态数据,方便后续的访问和验证。
然而,当用户退出登录或者会话过期时,应该及时销毁Session以避免安全问题。
以下是几种常见的销毁Session的方法:1. 调用Session.invalidate()方法:该方法可以立即销毁当前Session中的所有数据,并释放所有相关资源。
例如,在用户退出登录时,可以调用该方法清空Session:```request.getSession().invalidate();```2. 设置Session超时时间:可以通过设置Session的最大存活时间来控制Session的自动销毁。
例如,设置Session在30分钟内没有活动就自动销毁:```session.setMaxInactiveInterval(1800); // 30 minutes```3. 使用Filter过滤器:可以使用Filter过滤器来拦截所有请求,检查Session是否过期或是否需要销毁。
例如,可以编写一个过滤器,在用户访问任何页面时检查Session是否过期,如果过期则立即销毁:```public class SessionFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {HttpServletRequest httpRequest = (HttpServletRequest) request;HttpSession session = httpRequest.getSession(false);if (session != null && !session.isNew() &&session.getAttribute('user') == null) {session.invalidate();}chain.doFilter(request, response);}// ...}```总之,及时销毁Session是Web开发中非常重要的安全措施之一,应该在编写Web应用程序时予以考虑。
关于Session过期和失效20:02:47 Session虽然我们经常在⽤,但以前对此理解不深,今天特别整理如下: 1.什么是Session?session其实就是⼀个Map,【键=值】对,通过session.getAttribute("name");获得session中设置的参数。
2.session的过期时间是从什么时候开始计算的?是从⼀登录就开始计算还是说从停⽌活动开始计算? 从session不活动的时候开始计算,如果session⼀直活动,session就总不会过期。
从该Session未被访问,开始计时,⼀旦Session被访问, 计时清零。
3.设置session的失效时间 a)web.xml中 <session-config> <session-timeout>30</session-timeout> </session-config> b)在程序中⼿动设置 session.setMaxInactiveInterval(30 * 60); //设置单位为秒,设置为-1永不过期 c)tomcat也可以修改session过期时间,在server.xml中定义context时采⽤如下定义: <Context path="/livsorder"docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600"isWARExpanded="true" isWARValidated="false" isInvokerEnabled="true" isWorkDirPersistent="false"/> 4.如何判断session是否过期 a)以前是根据 if(session.getAttribute('user')==null)判断是否为空 b) 如下为看到的⼀个帖⼦,判断session不为空的好⽅法: request.getSeesion(boolean)这个⽅法⾥⾯传了⼀个boolean值。
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为准。
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 ⽅法,因为有很多时候我们需要计
算两个⽇期之间的天数或者⼩时数,⽤这个就可以很⽅便的进⾏操作。
php如何设置⼀个严格控制过期时间的session1.php session 有效期PHP的session有效期默认是1440秒(24分钟),如果客户端超过24分钟没有刷新,当前session会被回收,失效。
当⽤户关闭浏览器,会话结束,session也会失效。
可以修改php.ini的session.gc_maxlifetime来设置session的⽣命周期,但并不能保证在超过这⼀时间后session信息⽴即会删除。
因为GC是按机率启动的,可能在某⼀个长时间内都没有被启动。
那么⼤量的session在超过session.gc_maxlifetime后仍然有效。
2.session.gc_maxlifetime,session.gc_probability,session.gc_divisor说明session.gc_maxlifetime = 30 表⽰当session⽂件在30秒后没有被访问,则视为过期session,等待GC回收。
GC进程调⽤的概率是通过session.gc_probability/session.gc_divisor计算得来的,⽽session.gc_divisor默认是1000,如果session.gc_probability = 1000,那么GC进程在每次执⾏session_start()时都会调⽤,执⾏回收。
把session.gc_probability/session.gc_divisor的机率提⾼,会有帮助,但会对性能造成严重影响。
3.严格控制session过期⽅法1.使⽤memcache/Redis来保存session,设置过期时间,因为memcache/redis的回收机制不是按机率的,可以确保session过期后失效。
2.只使⽤php实现,创建⼀个session类,在session写⼊时,把过期时间也写⼊。
读取时,根据过期时间判断是否已过期。
<?php/*** Session控制类*/class Session{/*** 设置session* @param String $name session name* @param Mixed $data session data* @param Int $expire 超时时间(秒)*/public static function set($name, $data, $expire=600){$session_data = array();$session_data['data'] = $data;$session_data['expire'] = time()+$expire;$_SESSION[$name] = $session_data;}/*** 读取session* @param String $name session name* @return Mixed*/public static function get($name){if(isset($_SESSION[$name])){if($_SESSION[$name]['expire']>time()){return $_SESSION[$name]['data'];}else{self::clear($name);}}return false;}/*** 清除session* @param String $name session name*/private static function clear($name){unset($_SESSION[$name]);}}>demo:<?phpsession_start();$data = '123456';session::set('test', $data, 10);echo session::get('test'); // 未过期,输出sleep(10);echo session::get('test'); // 已过期>以上就是本⽂的全部内容,希望本⽂的内容对⼤家的学习或者⼯作能带来⼀定的帮助,同时也希望多多⽀持!。
tomcat设置session过期时间(四种⽅式)1、在tomcat——>conf——>servler.xml⽂件中定义:1. <Context path="/test" docBase="/test"2. defaultSessionTimeOut="3600" isWARExpanded="true"3. isWARValidated="false" isInvokerEnabled="true"4. isWorkDirPersistent="false"/>2、在web.xml中定义:这个针对具体项⽬:1. <session-config>2. <session-timeout>20</session-timeout>3. </session-config>3、在程序中定义:这个就针对具体页⾯了:session.setMaxInactiveInterval(30*60);4、配置tomcat的session持久化:1. <Manager2. className="org.apache.catalina.session.PersistentManager"3. saveOnRestart="true"4. maxActiveSession="-1"5. minIdleSwap="0"6. maxIdleSwap="30"7. maxIdleBackup="0"8. >9. <Store10. className="org.apache.catalina.session.FileStore"11. checkInterval=”60”12. directory="../session"/>13. </Manager>或1. <Store2. calssName="org.apache.catalina.JDBCStore"3. driverName="com.mysql.jdbc.Driver"4. connectionURL="jdbc:mysql://localhost/tomsessionDB?user=root&password="5. sessionTable="tomcat_session"6. sessionIdCol="session_id"7. sessionDataCol="session_data"8. sessionValidCol="session_valid"9. sessionMaxInactiveCol="max_inactive"10. sessionLastAccessedCol="last_access"11. sessionAppCol="app_name"12. checkInterval="60"13. debug="99" />maxActiveSessions-可处于活动状态的session数,default -1 不限制checkInterval -检查session是否过期的时间间隔,default 60ssaveOnRestart-服务器关闭时,是否将所有的session保存到⽂件中;minIdleSwap/maxIdleSwap-session处于不活动状态最短/长时间(s),sesson对象转移到File Store中;(-1表⽰没有限制) maxIdleBackup-超过这⼀时间,将session备份。
在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session。
具体设置很简单:在主页面或者公共页面中加入:session.setMaxInactiveInterval(900);参数900单位是秒,即在没有活动15分钟后,session将失效。
这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。
所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。
在一般系统中,也可能需要在session失效后做一些操作,(1)控制用户数,当session失效后,系统的用户数减少一个等,控制用户数在一定范围内,确保系统的性能。
(2)控制一个用户多次登录,当session有效时,如果相同用户登录,就提示已经登录了,当session失效后,就可以不用提示,直接登录了那么如何在session失效后,进行一系列的操作呢?这里就需要用到监听器了,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序,就可以了。
监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法自己可以继承这个类,然后分别实现。
sessionCreated指在session创建时执行的方法sessionDestroyed指在session失效时执行的方法给一个简单的例子:public class SessionListener implements HttpSessionListener{public void sessionCreated(HttpSessionEvent event) { HttpSession ses = event.getSession();String id=ses.getId()+ses.getCreationTime(); erMap.put(id, Boolean.TRUE); //添加用户}public void sessionDestroyed(HttpSessionEvent event) { HttpSession ses = event.getSession();String id=ses.getId()+ses.getCreationTime();synchronized (this) {ERNUM--; //用户数减一erMap.remove(id); //从用户组中移除掉,用户组为一个map}}然后只需要把这个监听器在web.xml中声明就可以了例如:<listener><listener-class>com.summer.kernel.tools.SessionListener</listener-class></listener>补充:具体设置很简单,方法有三种:(1)在主页面或者公共页面中加入:java 代码1.HttpSession ses = request.getSession();2.ses.setMaxInactiveInterval(10);session.setMaxInactiveInterval(900);参数900单位是秒,即在没有活动15分钟后,session将失效。
在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session。
具体设置很简单:在主页面或者公共页面中加入:session.setMaxInactiveInterval(900);参数900单位是秒,即在没有活动15分钟后,session将失效。
这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。
所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。
在一般系统中,也可能需要在session失效后做一些操作,(1)控制用户数,当session失效后,系统的用户数减少一个等,控制用户数在一定范围内,确保系统的性能。
(2)控制一个用户多次登录,当session有效时,如果相同用户登录,就提示已经登录了,当session失效后,就可以不用提示,直接登录了那么如何在session失效后,进行一系列的操作呢?这里就需要用到监听器了,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序,就可以了。
监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法自己可以继承这个类,然后分别实现。
sessionCreated指在session创建时执行的方法sessionDestroyed指在session失效时执行的方法给一个简单的例子:public class SessionListener implements HttpSessionListener{public void sessionCreated(HttpSessionEvent event) { HttpSession ses = event.getSession();String id=ses.getId()+ses.getCreationTime(); erMap.put(id, Boolean.TRUE); //添加用户}public void sessionDestroyed(HttpSessionEvent event) { HttpSession ses = event.getSession();String id=ses.getId()+ses.getCreationTime();synchronized (this) {ERNUM--; //用户数减一erMap.remove(id); //从用户组中移除掉,用户组为一个map}}然后只需要把这个监听器在web.xml中声明就可以了例如:<listener><listener-class>com.summer.kernel.tools.SessionListener</listener-class></listener>补充:具体设置很简单,方法有三种:(1)在主页面或者公共页面中加入:java 代码1.HttpSession ses = request.getSession();2.ses.setMaxInactiveInterval(10);session.setMaxInactiveInterval(900);参数900单位是秒,即在没有活动15分钟后,session将失效。
session常用方法Session是一种在Web开发中常用的机制,用于在不同请求之间保持用户的状态信息。
在本文中,我们将介绍一些常用的Session方法,以帮助开发者更好地使用Session来管理用户的状态。
1. 创建Session对象:在使用Session之前,我们需要先创建一个Session对象。
在大多数Web开发框架中,创建Session对象的方法很简单,只需要调用相应的函数或方法即可。
例如,在Flask框架中,可以使用`session = flask.session`来创建一个Session对象。
2. 设置Session值:一旦创建了Session对象,我们就可以使用它来存储和设置用户的状态信息。
可以通过`session[key] = value`的方式来设置Session 的值。
其中,key是一个字符串,表示状态的名称;value可以是任意类型的数据,用于存储相应状态的值。
例如,可以使用`session['username'] = 'John'`来设置一个名为'username'的状态,其值为'John'。
3. 获取Session值:在需要使用Session中的状态信息时,可以通过`session[key]`来获取相应的值。
例如,可以使用`username = session['username']`来获取名为'username'的状态的值,并将其赋给变量username。
需要注意的是,如果获取的状态不存在,会抛出一个异常,因此在使用之前最好先进行判断。
4. 删除Session值:有时候,我们需要删除Session中的某个状态。
可以通过`del session[key]`的方式来删除相应的状态。
例如,可以使用`del session['username']`来删除名为'username'的状态。
关于Session过期问题及其解决办法1.⽬录删除及重命名操作 :如果你发现session突然⽆理由的丢失,⽽当你认真的检查代码并且排除其它常规可能丢失的可能性时,你可能会像我⼀样,⼏乎要接近崩溃~!后来发现问题出在我⽤代码创建⼀个临时⽬录然后删除临时⽬录的删除操作上。
现在和⼤家分享下:希望对碰到类似钉⼦的朋友有⽤。
说⽩了session丢失实质就是:应⽤程序重起!应⽤程序什么时候⾃动重起呢?请参考:也就是说 会监视应⽤程序⽬录,⼀但有被监视的动作发⽣(⽐如:修改了config、重命名⽬录等)应⽤程序就会⾃动重起当然这时你的session⼀定丢失了。
如果避免不了这种操作(如:重命名⽬录);这⾥我们可以⽤cookie存信息或存到数据库去;注意:除了以上列出的英⽂条件外。
⽬录的删除操作⼀定丢失session。
的内部机制对待⽬录有点像个守财奴,它死守着⽬录,你创建它不会管(往⾥加),⼀但创建他就会监视该⽬录,若你要删除或重命名它的(动它的⽬录),它就发⽣重起了。
2.Frame中关于Session丢失在开发中,我们经常会遇到使⽤Frame来⼯作,⽽且有时是为了跟其他⽹站集成,应⽤到多域的情况下,⽽Iframe是不能保存Session的。
因此,⽹上可以找到很多相关的⽂章,如果⽹站可以采⽤设置Web.Config中的配置:<sessionStatemode="StateServer"stateConnectionString="tcpip=127.0.0.1:42424"sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"cookieless="false"timeout="40"/>把cookieless="false"改成"true"就可以了。
关于session的过期时间的⽅法
session的的过期时间的设置,通⽤的三种⽅法:
1. 直接在后台代码中设计,使⽤session.setMaxInactiveInterval(60*60);
注意这个时间的单位是秒,60*60就是⼀⼩时。
如果将时间设置为负数,则表⽰⽤不过期。
2.在项⽬的web.xml⽂件中添加配置过期时间的代码即可。
<session-config>
<session-timeout>400</session-timeout>
</session-config>
这个时间的单位是分钟,上⾯的配置就是session的有效期是400分钟。
如果将时间设置为负数,则表⽰⽤不过期
3.在服务器端配置,在Tomcat的conf的web.xml中修代码
<session-config>
<session-timeout>30</session-timeout>
</session-config>
中将30改为想要设置的过期时间,这个单位是分钟。
如果不修改则tomcat默认30分钟过期,
如果将时间设置为负数,则表⽰⽤不过期。
总之:三种⽅法都可以成功设置session的过期时间,但是有⼀点需要注意,就是三种过期时间的有限级不同。
优先级:⽅法1>⽅法2>⽅法3。
C#中设置session过期的时间【**需进一步跟进**】 默认配置下,Session莫名丢失的原因及解决办法正常操作情况下Session会无故丢失。
因为程序是在不停的被操作,排除Session超时的可能。
另外,Session超时时间被设定成60分钟,不会这么快就超时的。
这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。
现在我就把原因和解决办法写出来。
原因:由于程序是默认配置,所以Web.Config文件中关于Session的设定如下:<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='datasource=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感)。
默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。
哪些情况下该进程会重起呢?微软的一篇文章告诉了我们:1、配置文件中processModel标签的memoryLimit属性2、Global.asax或者Web.config文件被更改3、Bin文件夹中的Web程序(DLL)被修改4、杀毒软件扫描了一些.config文件。
更多的信息请参考PRB: Session variables are lost intermittently in applications解决办法:前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。
WebLogic如何设置session超时时间1、web.xml设置WEB应⽤程序描述符web.xml⾥的<session-timeout>元素。
这个值以分钟为单位,并覆盖weblogic.xml中的TimeoutSecs属性<session-config><session-timeout>60</session-timeout></session-config>此例表⽰Session将在60分钟后过期当<session-timeout>设置为-2,表⽰将使⽤在weblogic.xml中设置的TimeoutSecs这个属性值。
当<session-timeout>设置为-1,表⽰Session将永不过期,⽽忽略在weblogic.xml中设置的TimeoutSecs属性值。
该属性值可以通过console控制台来设置2、weblogic.xml设置WebLogic特有部署描述符weblogic.xml的<session-descriptor>元素的TimeoutSecs属性。
这个值以秒为单位<session-descriptor><session-param><param-name>TimeoutSecs</param-name><param-value>3600</param-value></session-param></session-descriptor>默认值是36003、jsp中控制session.setmaxinactiveinterval(7200);session是默认对象,可以直接引⽤,单位秒s4、servlet中控制httpsession session = request.getsession();session.setmaxinactiveinterval(7200);单位秒s如果使⽤WEBLOGIC作为应⽤服务器,设置SESSION超时时间会选择在WEBLOGIC的控制台设定。
springboot设置session超时时间springboot1.x设置session超时时间:按优先级⾼到低说:第⼀种:spring boot 启动类⾥⾯:1package com.mycenter;23import org.mybatis.spring.annotation.MapperScan;4import org.springframework.boot.SpringApplication;5import org.springframework.boot.autoconfigure.SpringBootApplication;6import org.springframework.boot.context.embedded.EmbeddedServletContainerCustomizer;7import org.springframework.boot.web.servlet.ServletComponentScan;8import org.springframework.context.annotation.Bean;910 @SpringBootApplication11 @MapperScan(value = "com.mycenter.mapper")12 @ServletComponentScan13public class MycenterApplication {1415public static void main(String[] args) {16 SpringApplication.run(MycenterApplication.class, args);17 }181920 @Bean21public EmbeddedServletContainerCustomizer containerCustomizer(){22return container -> {23 container.setSessionTimeout(7200);/*单位为S*/24 };25 }26 }第⼆种:暂时⽤这两种。
在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户没有使用系统一定时间后,自动退出登录,销毁session。
具体设置很简单:
在主页面或者公共页面中加入:
session.setMaxInactiveInterval(900);
参数900单位是秒,即在没有活动15分钟后,session将失效。
这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。
所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。
在一般系统中,也可能需要在session失效后做一些操作,
(1)控制用户数,当session失效后,系统的用户数减少一个等,控制用户数在一定范围内,确保系统的性能。
(2)控制一个用户多次登录,当session有效时,如果相同用户登录,就提示已经登录了,当session失效后,就可以不用提示,直接登录了
那么如何在session失效后,进行一系列的操作呢?
这里就需要用到监听器了,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序,就可以了。
监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法
自己可以继承这个类,然后分别实现。
sessionCreated指在session创建时执行的方法
sessionDestroyed指在session失效时执行的方法
给一个简单的例子:
public class SessionListener implements HttpSessionListener{
public void sessionCreated(HttpSessionEvent event) { HttpSession ses = event.getSession();
String id=ses.getId()+ses.getCreationTime(); erMap.put(id, Boolean.TRUE); //添加用户
}
public void sessionDestroyed(HttpSessionEvent event) { HttpSession ses = event.getSession();
String id=ses.getId()+ses.getCreationTime();
synchronized (this) {
ERNUM--; //用户数减一
erMap.remove(id); //从用户组中移除掉,用户组为一个map
}
}
然后只需要把这个监听器在web.xml中声明就可以了
例如:
<listener>
<listener-class>
com.summer.kernel.tools.SessionListener
</listener-class>
</listener>
补充:
具体设置很简单,方法有三种:
(1)在主页面或者公共页面中加入:
java 代码
1.HttpSession ses = request.getSession();
2.ses.setMaxInactiveInterval(10);
session.setMaxInactiveInterval(900);
参数900单位是秒,即在没有活动15分钟后,session将失效。
这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。
所以如果是在调试程序,应该是修改服务器端时间来测试,而不是客户端。
(2)也是比较通用的设置session失效时间的方法,就是在项目的
web.xml中设置
<session-config>
<session-timeout>15</session-timeout>
</session-config>
这里的15也就是15分钟失效.
(3)直接在应用服务器中设置,如果是tomcat,可以在tomcat目录下conf/web.xml中
找到<session-config>元素,tomcat默认设置是30分钟,只要修改这个值就可以了。
在server.xml中定义context中如下定义:
xml 代码
<Context path="/livsorder" docBase="/home/httpd/html/livsorder" defaultSessionTimeOut="3600" isWARExpanded="true"
isWARValidated="false" isInvokerEnabled="true"
isWorkDirPersistent="false"/>
需要注意的是如果上述三个地方如果都设置了,有个优先级的问题,从高到低:
(3)◊(2)---◊(1)--
相关文章:
•Session过期时间的四种设置方式•PHP中,设定Session过期时间
•设置Session过期时间的问题•设置用于Session的Cookie的过期...
•ASP中Session技巧默认过期时
间...
•
判断Session的过期时间-采用
Java...。