精华内容
下载资源
问答
  • 如何判断session超时
    千次阅读
    2021-02-28 17:04:57

    在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session

    具体设置的方法有三种:

    1.在web容器中设置(以tomcat为例)

    在tomcat-7.0\conf\web.xml中设置,以下是tomcat7.0中默认配置:

    30

    tomcat默认session超时时间为30分钟,可以根据需要修改,负数或0为不限制session失效时间

    这里要注意这个session设置的时间是根据服务器来计算的,而不是客户端。所以如果在调试程序,应该是修改服务器端时间来测试,而不是客户端

    2.在工程的web.xml中设置

    15

    这里的15是指15分钟失效

    3.通过java代码设置

    session.setMaxInactiveInterval(30*60);//以秒为单位,即在没有活动30分钟后,session将失效

    三种方式优先等级:1 < 2 < 3

    在一般系统中,也可能需要在session失效后做一些操作:

    1.控制用户数,当session失效后,系统的用户数减少一个,控制用户数量在一定范围内,确保系统的性能

    2.控制一个用户多次登录,当session有效时,如果相同用户登录,就提示已经登录了,当session失效后,就可以不同提示,直接登录

    那么如何在session失效后,进行一系列的操作呢?

    这里就需要用到监听器了,即当session因为各种原因失效后,监听器就可以监听到,然后执行监听器中定义好的程序就可以了

    监听器类为:HttpSessionListener类,有sessionCreated和sessionDestroyed两个方法

    自己可以继承这个类,然后分别实现

    sessionCreated指在session创建时执行的方法

    sessionDestroyed指在session失效时执行的方法

    例子:

    public class OnlineUserListener implements HttpSessionListener{

    public void sessionCreated(HttpSessionEvent event){

    HttpSession session=event.getSession;

    String id=session.getId()+session.getCreationTime();

    SummerConstant.UserMap.put(id,Boolean.TRUE);//添加用户

    }

    public void sessionDestroyed(HttpSessionEvent event){

    HttpSession session=event.getSession;

    String id=session.getId()+session.getCreationTime();

    synchronized(this){

    SummerConstant.USERNum--;//用户数减-

    SummerConstant.UserMap.remove(id);//从用户组中移除掉,用户组为一个map

    }

    }

    }

    然后只需要把这个监听器在web.xml中声明就可以了

    com.demo.OnlineUserListener

    转!!Java设置session超时(失效)的时间

    Java设置session超时(失效)的时间   在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session具体设置的方法有三种:1 ...

    Java设置session超时(失效)的三种方式

    1. 在web容器中设置(此处以tomcat为例) 在tomcat-6.0\conf\web.xml中设置,以下是tomcat 6.0中的默认配置:

    更多相关内容
  • 一:前言:最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是session超时,debug...系统又如何判断session超时的呢?接下来就一一进行解答。二:系统sessio...

    一:前言:

    最近支付后台登录一段时间后如果没有任何操作,总是需要重新登录才可以继续访问页面,出现这个问题的原因就是session超时,debug代码后发现session的超时时间是1800s。也就是说当1800秒内没有任何操作,session就会出现超时现象。那这个超时时间是如何设置的呢?然后该如何重新设置此超时时间呢?系统又如何判断session超时的呢?接下来就一一进行解答。

    二:系统session超时时间如何默认的?

    说明:获取session超时时间的方法为”request.getSession().getMaxInactiveInterval()",但是tomcat中设置超时时间的参数为“sessionTimeout”,那么他们是怎么联系起来的呢?

    第一步:加载sessionTimeout参数。

    1、项目运行初始化通过“@ConfigurationProperties”注解加载“org.springframework.boot.autoconfigure.web.ServerProperties”类。

    //springBoot中默认的配置文件为"application.yml"或者"application.perties"文件,也就是说server是其中的一个配置参数。

    @ConfigurationProperties(prefix = "server", ignoreUnknownFields = true)

    public class ServerProperties

    implements EmbeddedServletContainerCustomizer, EnvironmentAware, Ordered {

    //代码

    }

    2、上面类中“ServerProperties”继承自“EmbeddedServletContainerCustomizer”接口。重写customize方法,之后在此方法中“向上推”,即可找到“AbstractConfigurableEmbeddedServletContainer  ”类。

    @Override

    public void customize(ConfigurableEmbeddedServletContainer container) {

    //多个参数判断,如果在application中没配置的情况下都是null

    if (getPort() != null) {

    container.setPort(getPort());

    }

    ...//n多个参数判断,

    //以下的代码就是重点,因为是tomcat容器,所以以下条件为“真”,经过一系列的查找父类或者实现接口即可找到抽象类“AbstractConfigurableEmbeddedServletContainer”

    //public class TomcatEmbeddedServletContainerFactory extends AbstractEmbeddedServletContainerFactory implements ResourceLoaderAware

    //public abstract class AbstractEmbeddedServletContainerFactory extends AbstractConfigurableEmbeddedServletContainer implements EmbeddedServletContainerFactory

    if (container instanceof TomcatEmbeddedServletContainerFactory) {

    getTomcat().customizeTomcat(this,

    (TomcatEmbeddedServletContainerFactory) container);

    }

    //以上代码执行完成之后,实际上已经有对应的session所有的默认参数,之后通过下面方法,将所有参数放入对应的容器中。第3、4步就是设置过程

    container.addInitializers(new SessionConfiguringInitializer(this.session));

    }

    3、在“AbstractConfigurableEmbeddedServletContainer”类中终于可以找到“超时时间”的相关设置

    //重要代码

    //45行

    private static final int DEFAULT_SESSION_TIMEOUT = (int) TimeUnit.MINUTES

    .toSeconds(30);

    //66行

    private int sessionTimeout = DEFAULT_SESSION_TIMEOUT;

    @Override

    public void setSessionTimeout(int sessionTimeout) {

    this.sessionTimeout = sessionTimeout;

    }

    //171-188行

    @Override

    public void setSessionTimeout(int sessionTimeout, TimeUnit timeUnit) {

    Assert.notNull(timeUnit, "TimeUnit must not be null");

    this.sessionTimeout = (int) timeUnit.toSeconds(sessionTimeout);

    }

    /**

    * Return the session timeout in seconds.

    * @return the timeout in seconds

    */

    public int getSessionTimeout() {

    return this.sessionTimeout;

    }

    4、执行第2步的”Container.addInitializers(new SessionConfiguringInitializer(this.session))“加载所有的配置参数。

    public static class Session {

    /**

    * Session timeout in seconds.

    */

    private Integer timeout;

    public Integer getTimeout() {

    return this.timeout;

    }

    //将session超时时间设置进来

    public void setTimeout(Integer sessionTimeout) {

    this.timeout = sessionTimeout;

    }

    第二步:将上面的超时时间赋值给“MaxInactiveInterval”参数。

    说明:既然上面tomcat需要的参数都已经加载完成,那么接下来就会运行tomcat,此处不做细讲,直接进入tomcat启动和加载参数说明。在“TomcatEmbeddedServletContainerFactory”类中的方法调用流程如下:

    getEmbeddedServletContainer--》prepareContext--》configureContext--》configureSession--》getSessionTimeoutInMinutes。

    1、调用configureSession设置tomcat的Session配置参数。

    //以下代码

    private void configureSession(Context context) {

    long sessionTimeout = getSessionTimeoutInMinutes();

    context.setSessionTimeout((int) sessionTimeout);

    Manager manager = context.getManager();

    if (manager == null) {

    manager = new StandardManager();

    //此处即为设置相应的参数的位置。之后会调用StandardContext类的setManger(Manager)方法,在setManger中会调用"manager.setContext(this)"

    context.setManager(manager);

    }

    }

    //计算超时时间为分钟(注意:此处会将之前的1800秒,转换为30分钟)。可以看出最终的时间结果是个整数的分钟类型,也就是说如果设置的超时时间(单位为秒)不是60的倍数,也会最终转换为60的倍数,并且最小超时时间设置的是60秒。

    private long getSessionTimeoutInMinutes() {

    long sessionTimeout = getSessionTimeout();

    if (sessionTimeout > 0) {

    sessionTimeout = Math.max(TimeUnit.SECONDS.toMinutes(sessionTimeout), 1L);

    }

    return sessionTimeout;

    }

    2、最终将SessionTimeout赋值给MaxInactiveInterval。终于完成session超时时间设置。

    //以下代码

    @Override

    public void setContext(Context context) {

    //省略其余设置代码,直接重新设置Session超时时间,此时又将上面的分钟单位转为秒。此时终于给Sesseion设置了默认超时时间。

    if (this.context != null) {

    setMaxInactiveInterval(this.context.getSessionTimeout() * 60);

    this.context.addPropertyChangeListener(this);

    }

    }

    三:如果自定义超时时间呢?

    其实从上面的流程,已经不难看出,只需要在“org.springframework.boot.autoconfigure.web.ServerProperties”类中找到对应的Session参数,初始化让其加载上来即可完成设置。

    /**

    * Get the session timeout.

    * @return the session timeout

    * @deprecated since 1.3.0 in favor of {@code session.timeout}.

    */

    @Deprecated

    @DeprecatedConfigurationProperty(replacement = "server.session.timeout")

    public Integer getSessionTimeout() {

    return this.session.getTimeout();

    }

    所以在application中配置“server.session.timeout“即可,参数类型为long类型,单位为”秒“。

    四:运行程序是如何判断session超时的?

    其实很简单:只需要在每次本次同一个sessionequest请求的时间,和之前的请求时间进行比较,发现两个值的差已经大于MaxInactiveInterval的值即可。

    //判断是否超时

    @Override

    public boolean isValid() {

    //省略多个条件判断

    if (maxInactiveInterval > 0) {

    //判断此session空闲时间是否比maxInactiveInterval大,如果大的情况下,session就超时

    int timeIdle = (int) (getIdleTimeInternal() / 1000L);

    if (timeIdle >= maxInactiveInterval) {

    expire(true);

    }

    }

    return this.isValid;

    }

    //将上次访问时间和当前时间比较,拿到空闲时间值

    @Override

    public long getIdleTimeInternal() {

    long timeNow = System.currentTimeMillis();

    long timeIdle;

    if (LAST_ACCESS_AT_START) {

    timeIdle = timeNow - lastAccessedTime;

    } else {

    timeIdle = timeNow - thisAccessedTime;

    }

    return timeIdle;

    }

    说明:

    所以为了保证session超时时间长点,可以在application配置文件中配置“server.session.timeout”参数即可,参数单位为“秒”,如果参数不是60的整数倍,会转换成60的整数倍(见二:系统如何设置超时时间、步骤二中的“1”中算法)。如不满一分钟,会转换为60秒。

    扩展:

    实际上也可以直接重写EmbeddedServletContainerCustomizer的customize方法进行赋值。

    @Bean

    public EmbeddedServletContainerCustomizer containerCustomizer(){

    return new EmbeddedServletContainerCustomizer() {

    @Override

    public void customize(ConfigurableEmbeddedServletContainer container) {

    container.setSessionTimeout(600);//单位为S

    }

    };

    }

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    展开全文
  • 主要介绍了Java中设置session超时(失效)的三种方法,本文讲解了在web容器中设置、在工程的web.xml中设置、通过java代码设置3种方法,需要的朋友可以参考下
  • 主要介绍了Java设置session超时的几种方式总结的相关资料,需要的朋友可以参考下
  • 下面小编就为大家带来一篇Web 开发中Ajax的Session 超时处理方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • 主要介绍了Javaweb项目session超时解决方案,关于解决方案分类比较明确,内容详细,需要的朋友可以参考下。
  • 主要介绍了JSP Session超时设置的实现方法的相关资料,这里提供三种方法帮助大家学习理解这部分内容,需要的朋友可以参考下
  • 在web.config设置sessionState 或者类文件里设置Session.Timeout,在IIS里访问时每次都是达不到时间就超时,原因是因为在IIS中设置了 1. web.config中设置Session过期时间方法, 2. II7.5 界面图形设置
  • 这里模仿jquery的处理方式实现webix的ajax请求session超时跳转。 具体的做法: 1、查看webix.js源码发现webix.ajax只有请求前的监听函数 “onBeforeAjax”, 要做到获取返回状态跳转登录页面必须要有个返回的监听...
  • session 超时

    2019-03-27 04:00:51
    NULL 博文链接:https://master3003.iteye.com/blog/1178419
  • 主要介绍了IIS 7.5中asp Session超时时间设置方法,需要的朋友可以参考一下
  • server.session.timeout= springboot2.0为 server.servlet.session.timeout= 我用的springboot2 按着ctrl 鼠标点击timeout,可以查看源码 要求的参数是Duration 这是jdk8新加的 点开Duration 意思为 基于时间的...

    springboot1.0为
    server.session.timeout=
    springboot2.0为
    server.servlet.session.timeout=

    我用的springboot2

    按着ctrl 鼠标点击timeout,可以查看源码

    要求的参数是Duration

    这是jdk8新加的

    点开Duration

    意思为

    基于时间的时间量

    这个类以秒和纳秒为单位模拟时间的数量或数量。

    可以使用其他基于持续时间的单位访问,例如分钟和小时。

    继续往下翻

    可以传值文本

    展开全文
  • jquery ajax方法调用在session超时以后如何跳转到登录页面?  session超时以后虽然被过滤器过滤到了,但是并不会跳转到登录页面请求具体的解决方法。  我参考了这篇文章,但是我调用ajaxStart不起作用。  ...

    --转自http://www.iteye.com/problems/70335

    jquery ajax方法调用在session超时以后如何跳转到登录页面? 

    session超时以后虽然被过滤器过滤到了,但是并不会跳转到登录页面请求具体的解决方法。 

    我参考了这篇文章,但是我调用ajaxStart不起作用。 

    http://www.blogjava.net/vickzhu/archive/2009/06/05/280223.html 

    ext jquery 用户访问超时(ext session过期) 

    解决两种情况下的用户访问超时。 
    a)普通http请求的session超时。 
    b)异步http请求的session超时,使用ext后大部分的界面刷新都是异步的ajax请求。 

    不管是那种类型的http请求总是可以由一个过滤器来捕捉。 
    分类:普通http请求的header参数中没有x-requested-with:XMLHttpRequest头信息,而异步的有。 
    其实对于常见的ajax框架,header中还有标示自己身份的header信息。 

    对于普通的http请求,发现session超时后直接重定向到一个超时页面,显示访问超时。 
    对于异步http请求,发现session超时后则向请求的response中写入特定的超时头信息,客户端ajax对象检测 
    头信息,发现有超时状态标志后调用显示超时信息的javascript方法,提示用户访问超时。 

    服务器端session超时后在过滤器中为response添加新的头信息,标记该请求超时: 

    if(r.getHeader("x-requested-with")!=null 
    && r.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){ 
    response.setHeader("sessionstatus","timeout"); 

    使用Ext.Ajaxt对象完成异步请求的交互,Ext.Ajax是单实例对象(非常重要,全局单一Ext.Ajax实例!)。 
    注册Ext.Ajax的requestcomplete事件,每个ajax请求成功后首先响应该事件。在该事件的回调函数里面判断 
    访问请求是否超时。使用Ext.Ajax对象的好处是,只需要引入一个包含了几行超时处理代码的js文件,就可以 
    为当前应用增加超时处理功能,原有代码不需要做任何修改。 


    使用Ext.Ajaxt对象完成异步请求交互,假如checkUserSessionStatus是你的回调方法,每个页面引用: 

    Ext.Ajax.on('requestcomplete',checkUserSessionStatus, this); 
    function checkUserSessionStatus(conn,response,options){ 
    //Ext重新封装了response对象 
    if(typeof response.getResponseHeader.sessionstatus != 'undefined'){ 
    //发现请求超时,退出处理代码... 


    可以利用的几个特性:a)所有的ajax请求均带有x-requested-with:XMLHttpRequest头信息b)Ext.Ajax是单实例对象(非常重要,全局单一Ext.Ajax实例!)c)注册Ext.Ajax的requestcomplete事件,每个ajax请求成功后首先响应该事件(概念类似spring的aop拦截)。 
    jquery提供了几个全局事件可以用来处理session过期请求,如当ajax请求开始时会触发ajaxStart()方法的回调函数;当ajax请求结束时,会触发ajaxStop()方法的回调函数。这些方法都是全局的方法,因此无论创建它们的代码位于何处,只要有ajax请求发生时,都会触发它们。类似的事件还有:ajaxComplete(),ajaxError(),ajaxSend(),ajaxSuccess()等。 
    如果使某个ajax请求不受全局方法的影响,那么可以在使用$.ajax()方法时,将参数中的global设置为false,jquery代码如下:$.ajax({    url:"test.html",    global:false//不触发全局ajax事件}) 

    对于其他的ajax框架,解决用户访问请求超时这个问题的思路是类似的。 


    ---------------------------------------------------------------------------------------------------------------------------------------------

    --转自http://sd1992585.iteye.com/blog/963428

    extjs基于ajax实现,因为是异步请求,所以一般的jsp session过期跳转方式不可用,但是当它session过期时会手动去在页面头信息x-requested-with中插入XMLHttpRequest值,可以利用这

    点去进行exjs的session过期处理。这里提供大家一个方法:

    写一个Sessionfilter过滤器,检查是否session过期,过期时间通过web.xml配置(不明白具体步骤的上百度或者google详查),

    Java代码   收藏代码
    1. String head = httpRequest.getHeader("x-requested-with");(获得extjs session过期值)  
    2. if (head != null && !(head.equalsIgnoreCase("XMLHttpRequest"))) {   
    3.  if (sessionUser == null) {   
    4.   httpResponse.sendError(999); //添加respone报错信息  
    5.   filter.doFilter(httpRequest, httpResponse);   
    6.  }  
    7.  else{  
    8.   filter.doFilter(httpRequest, httpResponse);   
    9.  }  
    10. }  

     

    js中需要用到extjs中一个事件:

    Js代码   收藏代码
    1. Ext.Ajax.on('requestexception',function(conn,response,options) {  
    2.     if(response.status=="999"){  
    3.         Ext.Msg.alert('提示''会话超时,请重新登录!'function(){  
    4.          var url = document.getElementById("atsurlid").value;  
    5.             parent.location.href = url+'login.jsp';    
    6.         });     
    7.     }        
    8. });  

     

    然后可以实现session过期跳转。

    展开全文
  • 主要介绍了重写 ajax 实现 session 超时跳转到登录页面实例代码,需要的朋友可以参考下
  • 如何判断session超时

    2011-08-29 10:43:58
    Session Timeout Filter&lt;/filter-name&gt; &lt;filter-class&gt;com.vstsoft.common.filter.SessionTimeoutFilter&lt;/filter-class&gt; &lt;init-param&gt; &lt;par...
  • 如果session超时,而且是ajax请求,就会在响应头里。再用一个全局的方法来处理,session超时要跳转的页面
  • TongWeb session超时配置

    2021-10-20 16:47:38
    TongWeb的session超时时间默认为30分钟 Tongweb的session超时设置按照优先级从高到底依次为: 方式一: 此方法表示当前session在指定时间内若没有与服务器发生任何交互后失效 期间用户任何活动都...
  • websocket与session超时

    2018-09-21 01:30:31
    websocket一直连接着的话, 是不是session一直都不会超时呢? 现在web端需要使用websocket不断推送通知消息, 如果session永远不会超时, 那岂不是爆炸?
  • session超时拦截器

    2013-06-11 11:21:21
    页面session页面点击会报错,我可以配置拦截器进行拦截操作判断session是否过期。
  • 这时在TongWeb上配session超时时间、session共享、复制已无用。 1.单点登录SSO应用 以CAS应用为例,登录验证的是ticken,而不是session。配置因CAS版本不同而不同,相关超时配置如以下: <bean id=...
  • 设置Session超时的三种方法

    千次阅读 2021-04-12 09:51:35
    在Java代码中设置一些Session的属性配置 session.setMaxInactiveInterval(500); //设置超时时间,单位是s session.getId(); //获取sessionid ...session.setMaxInactiveInterval(500)这里的超时时间单位是秒..
  • 1、session原理cookie是保存在用户浏览器端的键值对session是保存在服务器端的键值对session服务端中存在的数据为: session = {随机字符串1:{用户1的相关信息}随机字符串2:{用户2的相关信息}} session客户端即...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 159,103
精华内容 63,641
热门标签
关键字:

如何判断session超时