`

spring security session 过期后页面跳转至登录页面

 
阅读更多

最近在开发一个政务方面的项目,系统框架用到了spring security,结果出现了一个问题:就是session过期后页面跳转至登录页面的问题;

 这里要分两种情况了;

 第一种:普通的请求,如form表单提交,重定向等

spring-security.xml配置如下:

<session-management invalid-session-url="http://172.31.60.117:8088/mslogin/view/login.jsp"  
session-fixation-protection="newSession" >
		   <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management> -

 web.xml配置如下:

<listener>
	 <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class>
</listener>
     

 于是就可以监听到session后期后普通请求的拦截,跳转至登录页面。结果后期测试发现ajax请求无法拦截至登录页面,这时候的现象为ajax请求发出后无法请求到数据,但是页面又不能跳转,于是代码改为下面这种,既可以支持普通请求拦截,又可以支持ajax请求拦截;

spring-security.xml 配置如下

 <session-management invalid-session-url="/public/invalidate" 
session-fixation-protection="newSession" >
<concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
</session-management>

 这里/public/invalidate为Controller请求路径:创建Controller

package com.jointem.ngcms.controller;

import java.io.IOException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * @Title: InvalidateSession
 * @Description: 
 * @Author: bql
 * @Date: 2016年4月20日
 * @Version: v1.0.0
 * @Copyright: 2016 www.jointem.com Inc. All rights reserved.
 * @Update: 1. Create File
 */
@Controller
public class InvalidateSession
{
    /**
     * This url gets invoked when spring security invalidates session (ie timeout).
     * Specific content indicates ui layer that session has been invalidated and page should be redirected to logout. 
     */
    @RequestMapping(value = "/public/invalidate")
    @ResponseBody
    public String invalidateSession(HttpServletRequest reqeust,HttpServletResponse response) {
    	 String ajaxHeader = reqeust.getHeader("X-Requested-With");
	        boolean isAjax = "XMLHttpRequest".equals(ajaxHeader);
	        if (isAjax) {
	        	return "invalidSession";
	        } else {
	        	try {
					response.sendRedirect("http://172.31.60.117:8088/mslogin/view/login.jsp");
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	        }
        return "";
    }
}

注意这里的几行代码为判断是否是ajax请求。

String ajaxHeader = reqeust.getHeader("X-Requested-With");
	        boolean isAjax = "XMLHttpRequest".equals(ajaxHeader);

 如果是ajax请求,则返回invalidSession字符串,在前端js中添加如下代码就可以监听到后端的返回值

//全局的ajax访问,处理ajax清求时sesion超时
       $.ajaxSetup({
    	   complete: function(xhr, status) {
                if (xhr.responseText == 'invalidSession') {
                    window.location = "http://172.31.60.117:8088/mslogin/view/login.jsp";
                }
            }
  }); 

 $.ajaxSetup为全局监听ajax请求,当后端返回值为invalidSession就可以跳转至自己需要的页面了。

 

 

 

在google 上搜了好半天,到最后也没解决掉问题,于是就自己改造为以上提供的代码,希望能帮助到遇到和我同样问题的小伙伴。

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics