springboot2中session超时,退到登录页面方式

目录
  • session超时退到登录页面
    • 1、首先在springboot中追加配置session的超时时间
    • 2、登录成功接口中把用户信息追加session中
    • 3、在WebMvcConfig中配置拦截规则和重定向规则
    • 4、实现拦截器,先跳转到超时页面
    • 5、在超时页面让用户等待几秒钟
  • session超时的问题

session超时退到登录页面

最近发现使用的工程居然没有session超时机制,功能太欠缺了,现在把追加方法分享出来,里面有一些坑,大家自由使用。

1、首先在springboot中追加配置session的超时时间

注意springboot2的写法发生了改变

springboot2写法

server:
  servlet:
    session:
      timeout: 1800s

springboot1写法

server:
    session:
      timeout: 1800s

2、登录成功接口中把用户信息追加session中

public ResponseEntity loginGo(HttpServletRequest request,String userName, String password) {
    // 此处省略若干
    HttpSession session = request.getSession(true);
    session.setAttribute("username", user.getUserRemark());
}

3、在WebMvcConfig中配置拦截规则和重定向规则

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/loginOverTime").setViewName("loginOverTime");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**") // 表示拦截所有的请求
                .excludePathPatterns("/login", "/loginOverTime", "/register", "/plugins/**", "/javascript/**", "/api/system/user/login","/img/**","/css/common/**");
                // 表示拦截所有的请求
    }
}

4、实现拦截器,先跳转到超时页面

这里采用先跳转中转页面loginOverTime,然后再跳转到登录页面,如果直接跳转到登录页面只能在页面的内部iframe中跳转,无法这个页面跳转

@Component
public class LoginInterceptor implements HandlerInterceptor {
    Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 获取session
        HttpSession session = request.getSession(true);
        // 判断用户是否存在,不存在就跳转到登录界面
        if(session.getAttribute("user") == null){
            response.sendRedirect(request.getContextPath()+"/loginOverTime");
            return false;
        }else{
            session.setAttribute("user", session.getAttribute("user"));
            return true;
        }
    }
}

5、在超时页面让用户等待几秒钟

然后自动跳转到login页面,提升一下用户体验

{% extends 'common/layout' %}
{% block head %}
<link href="{{ request.contextPath }}/css/common/loginOverTime.css" rel="external nofollow"  rel="stylesheet" />
{% endblock %}
{% block content %}
<body class="body_bg" >
    <div class="show">
        <div id="page">
            <h1>抱歉,登录超时~</h1>
            <h2> </h2>
            <font color="#666666">由于您长期未操作为了保证您的信息安全请重新登录!</font><br /><br />
            <div align="center" style="color: #666666">
                将于<span>3</span>秒后跳转至<a href="javascript:void(0)" rel="external nofollow" >登录页</a>
            </div>
        </div>
    </div>
</body>
{% endblock %}
{% block footer %}
<script type="text/javascript">
    $(document).ready(function(){
        // 关闭二级菜单
        if(parent.window.closeSecondMenu != undefined){
            parent.window.closeSecondMenu();
        }
        // 读秒显示
        var second = 3;
        // 设置定时任务
        window.setInterval("changeTime()", 1000);
        // 修改时间
        changeTime = function(){
            // 时间自动减1
            second--;
            // 修改页面上显示
            $("span").html(second);
            // 判断是否跳转登陆页
            if(second == 0){
                $("a").click();
            }
        }
        // 跳转至登录页
        $("a").click(function(){
            //window.location.href="{{ request.contextPath }}/login" rel="external nofollow" ;
            window.top.location="{{ request.contextPath }}/login";
        });
    });
</script>
{% endblock %}

这样就实现了sesseion超时退出的问题,大功告成

session超时的问题

最近在做SpringBoot的项目,用到了session,发现放置好session后,过一会就失效了,用下面发语句获取session失效时间,发现是60s

request.getSession().getMaxInactiveInterval();

去网上查找,发现大多解决问题的办法是 在启动类中main方法的下面加入以下方法来手动设置session失效时间

@Bean 
public EmbeddedServletContainerCustomizer containerCustomizer(){ 
       return new EmbeddedServletContainerCustomizer() { 
 @Override 
 public void customize(ConfigurableEmbeddedServletContainer Container) { 
       container.setSessionTimeout(1800);//单位为S 
            } 
       }; 
   } 

但是社会在发展,时代在进步,SpringBoot2.0以后已经不支持这种方式了

ps:可以在pom文件中查看你的SpringBooot版本。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.4.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

SpringBoot2.0以后的版本只需要在application.properties中加入以下配置就好

server.servlet.session.timeout = PT5H

这里重点解释一下 PT5H 意思是设置session失效的时间是5小时

通过查看setTimeouot的方法,这里要求传入Duration的实例

public void setTimeout(Duration timeout) {
   this.timeout = timeout;
}
  • Duration是在Java8中新增的,主要用来计算日期差值
  • Duration是被final声明的,并且是线程安全的
  • Duration转换字符串方式,默认为正,负以-开头,紧接着P,以下字母不区分大小写
  • D :天 T:天和小时之间的分隔符 H :小时  M:分钟  S:秒 每个单位都必须是数字,且时分秒顺序不能乱
  • 比如P2dt3m5s   P3d  pt3h

最后总结一下Duration最实用的一个功能其实是 between 方法,因为有很多时候我们需要计算两个日期之间的天数或者小时数,用这个就可以很方便的进行操作。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 关于springboot中对sqlSessionFactoryBean的自定义

    目录 springboot sqlSessionFactoryBean自定义 代码如下 以上配置也可以通过properties文件配置 springboot启动报找不到sqlSessionFactory springboot sqlSessionFactoryBean自定义 1.新建一个配置类,加上configuration注解 2.定制化SqlSessionFactoryBean,然后交给容器管理 代码如下 @Configuration public class MybatisConfig {

  • Springboot如何去掉URL后面的jsessionid

    目录 如何去掉URL后面的jsessionid url中有Jsessionid生成的原因 解决方式一 解决方式二 Java关于jsessionid和URL 对SEO的冲击 安全问题 解决之道 如何去掉URL后面的jsessionid url中有Jsessionid生成的原因 jsessionid是标明session的id,它存在于cookie中,一般情况不会出现在url中,服务器会从客户端的cookie中取出来,但是如果客户端禁用了cookie的话,就要重写url了,显式的将jsessionid

  • springboot2如何禁用自带tomcat的session功能

    目录 禁用自带tomcat的session功能 禁用内置Tomcat的不安全请求方法 禁用自带tomcat的session功能 微服务下的各个服务都是无状态的,所以这个时候tomcat的session管理功能是多余的,即时不用,也会消耗性能,关闭后tomcat的性能会有提升,但是springboot提供的tomcat没有配置选项可以直接关闭,研究了一下,tomcat默认的session管理器名字叫:StandardManager,查看tomcat加载源码发现,如果context中没有Manage

  • Springboot 配置SqlSessionFactory方式

    目录 Springboot 配置SqlSessionFactory Springboot SqlSessionFactory错误 Springboot 配置SqlSessionFactory Spring官方提供了比较完善的数据库配置,但是某些情况下需要自己手动加载(如:配置多数据源) 以下是我搜集并整理出来的一个configuration,不足之处或错误请大家提出并指正 package cn.xt.config; import org.mybatis.spring.SqlSessionFact

  • springboot如何通过session实现单点登入详解

    目录 我对于单点的理解 效果图走起 代码部分 总结 我对于单点的理解 正常的登录 进入自己系统的登录页面,输入用户名密码,登录系统. 单点登录 来到一个第三方的登录页面,输入用户名密码,在这个页面登录成功之后,就算成功的登录了应用系统.好处在于这个登录页面不仅仅是登录一个系统,可以同时登录多个系统.即所谓的一次登录,全程畅通. 效果图走起 另外开一个浏览器 原来的页面刷新一下 发现他已经被挤下线 代码部分 package com.nx.j2ee.service; import org.sprin

  • springboot项目如何设置session的过期时间

    目录 这里我们只介绍springboot2.0的session时间设置 下面这种方式是设置24小时的 或者使用第二种方式 springboot设置session失效的几种方式 如果是1.5.6版本 第二个 第三个 这里我们只介绍springboot2.0的session时间设置 Duration转换字符串方式,默认为正,负以-开头,紧接着P,(字母不区分大小写)D :天 T:天和小时之间的分隔符 H :小时 M:分钟 S:秒 每个单位都必须是数字,且时分秒顺序不能乱. 例如PT10M,就是设置为

  • springboot2中session超时,退到登录页面方式

    目录 session超时退到登录页面 1.首先在springboot中追加配置session的超时时间 2.登录成功接口中把用户信息追加session中 3.在WebMvcConfig中配置拦截规则和重定向规则 4.实现拦截器,先跳转到超时页面 5.在超时页面让用户等待几秒钟 session超时的问题 session超时退到登录页面 最近发现使用的工程居然没有session超时机制,功能太欠缺了,现在把追加方法分享出来,里面有一些坑,大家自由使用. 1.首先在springboot中追加配置ses

  • webix+springmvc session超时跳转登录页面

    引言 最近做项目,发现ajax请求不能在服务器中直接重定向到登录页面.查了些资料发现jquery的ajax请求有人给出了方法.但是webix的ajax请求和jquery的有些区别.这里模仿jquery的处理方式实现webix的ajax请求session超时跳转. 具体的做法: 1.查看webix.js源码发现webix.ajax只有请求前的监听函数 "onBeforeAjax", 要做到获取返回状态跳转登录页面必须要有个返回的监听函数,但是源码没有.所以我修改了下源码,加了个返回的监听

  • Shiro中session超时页面跳转的处理方式

    目录 session超时页面跳转的处理 问题描述 ajax请求超时处理 非ajax请求超时跳转 一个判断session是否过期的小技巧 1.session其实就是一个Map 2.session的过期时间是从什么时候开始计算的? 3.设置session的失效时间 4.如何判断session过没过期 session超时页面跳转的处理 问题描述 shiro在管理session后,在session超时会进行跳转,这里有两种情况需要考虑,一种是ajax方式的请求超时,一种页面跳转请求的超时. 本文从这两个

  • 详解SpringBoot中Session超时原理说明

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

  • Ajax Session失效跳转登录页面的方法

    在Struts应用中,我们发出的请求都会经过 相应的拦截器进行相关处理,一般都会有一个用户登录拦截(Session失效拦截):一般请求的话,如果Session失效时,我们会跳到登录页面,可是如果我们采用AJAX请求时,将会返回登录页面的HTML代码,这肯定不是我们想要的,那么我们如何解决呢?请看以下步骤: 一.建立拦截器 package com.xxx.planeap.interceptor; import javax.servlet.http.HttpServletRequest; impor

  • Javaweb项目session超时解决方案

    在Java Web开发中,Session为我们提供了很多方便,Session是由浏览器和服务器之间维护的.Session超时理解为:浏览器和服务器之间创建了一个Session,由于客户端长时间(休眠时间)没有与服务器交互,服务器将此Session销毁,客户端再一次与服务器交互时之前的Session就不存在了. 0.需求 需要对所有的/web/**请求进行登录拦截,Session超时时跳转到登录页面. 1.引入 一般来说,在项目使用中都会配置Session超时时间,如果不配置,则默认值为30分钟,

  • SpringBoot2.x设置Session失效时间及失效跳转方式

    目录 设置Session失效时间及失效跳转 Session失效后如何跳转到Session失效地址 设置Session失效的几种方式 如果是1.5.6版本 还可以设置 设置Session失效时间及失效跳转 #Session超时时间设置,单位是秒,默认是30分钟  server.servlet.session.timeout=10 然而并没有什么用,因为SpringBoot在TomcatServletWebServerFactory代码中写了这个     private long getSessio

  • 重写 ajax 实现 session 超时跳转到登录页面实例代码

    问题:使用window.location.href来跳转页面的时候,后端只需实现一个过滤器就可以在session超时的情况下重定向到登陆页面.但是使用ajax呢?使用ajax来执行会发生302错误,并且页面不可能跳转.下面就针对这个问题来贴上我的前后端代码. 1.session过滤器 import java.io.IOException; <p style="text-align: center"><img alt=""import javax.s

  • Session过期后自动跳转到登录页面的实例代码

    最近做了一个项目其中有需求,要实现自动登录功能,通过查阅相关资料,打算用session监听来做,下面给大家列出了配置监听器的方法: 1.在项目的web.xml文件中添加如下代码: <!--添加Session监听器--> <listener> <listener-class> 监听器路径 </listener-class> </listener> 2.编写java类. public class SessionListener implements

  • 登录超时给出提示跳到登录页面(ajax、导入、导出)

    一.一般页面登录超时验证,可以用过滤器filter,如下: package com.lg.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequ

随机推荐