文档章节

session失效页面跳转

lost_keke
 lost_keke
发布于 2017/03/27 15:14
字数 625
阅读 38
收藏 0

简单实现,如果session失效就返回到登录页面。使用Filter,同时过滤对静态页面和controller的访问,并且ajax请求也能跳转。

1. web.xml配置

<filter>
	<filter-name>loginfilter</filter-name>
	<filter-class>
		com.lty.ebus.custom.filters.CheckLoginFilter</filter-class>
	<init-param>
		<param-name>rootPath</param-name>
		<param-value>/login.jsp</param-value>
	</init-param>
</filter>
<!-- 所有需要session才能访问的JSP或HTML页面均放在webviews下-->
<filter-mapping>
	<filter-name>loginfilter</filter-name>
	<url-pattern>/webviews/*</url-pattern> 
</filter-mapping>
<!-- 过滤controller -->
<filter-mapping>
	<filter-name>loginfilter</filter-name>
	<url-pattern>/webapp/*</url-pattern>
</filter-mapping>

2. 过滤器

package com.lty.ebus.custom.filters;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.util.StringUtils;

import com.lty.ebus.common.constants.SysGlobalConstants;
import com.lty.ebus.common.redis.RedisHelper;

/**
 * @Title: CheckLoginFilter.java
 * @Package com.lantaiyuan.ebus.custom.interceptors
 * @Description:
 * @author yangyang
 * @date 2016年12月20日 下午2:14:06
 * @version v1.0
 */

public class CheckLoginFilter implements Filter {

	private String rootPath;

	public void destroy() {
		if (!StringUtils.isEmpty(rootPath)) {
			this.rootPath = null;
		}
	}

	public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
		HttpServletResponse response = (HttpServletResponse) res;
		HttpServletRequest request = (HttpServletRequest) req;
		Object session = RedisHelper.get(SysGlobalConstants.SESSIONID.concat(request.getSession().getId()));
		String uri = request.getRequestURI().toLowerCase();
		if (StringUtils.isEmpty(session) && uri.indexOf("login") < 0 && uri.indexOf("logout") < 0) {
			// 设置header,便于ajax请求做处理
			response.setHeader("sessionstatus", "timeout");
			response.setContentType("text/html;charset=UTF-8");
			response.getWriter()
					.println("<script language='javascript'>if(window.opener==null){window.top.location.href='"
							+ rootPath + "';}else{window.opener.top.location.href='" + rootPath
							+ "';window.close();}</script>");
		} else {
			chain.doFilter(req, res);
		}
	}

	public void init(FilterConfig con) throws ServletException {
		this.rootPath = con.getServletContext().getContextPath().concat(con.getInitParameter("rootPath"));
	}

}

非ajax请求到这一步就可以了,ajax请求还需要继续往下看

3. ajax请求

新建一个js文件,内容如下

/** 
 * 设置未来(全局)的AJAX请求默认选项 
 * 主要设置了AJAX请求遇到Session过期的情况 
 */  
var appName = $("#appName").val();

$.ajaxSetup({  
    complete: function(xhr,status) { 
        var sessionStatus = xhr.getResponseHeader('sessionstatus');  
        if(sessionStatus == 'timeout') {  
            var top = getTopWinow();  
            top.location.href = appName + '/login.jsp';              
        }  
    }  
});  
  
/** 
 * 在页面中任何嵌套层次的窗口中获取顶层窗口 
 * @return 当前页面的顶层窗口对象 
 */  
function getTopWinow(){  
    var p = window;  
    while(p != p.parent){  
        p = p.parent;  
    }  
    return p;  
}

该js文件需要被引入到有ajax请求(对session有要求)的页面中

此时就大功告成啦!

4. 补充说明

一开始出错,是因为filter写成了这样:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
			throws IOException, ServletException {
		HttpServletResponse response = (HttpServletResponse) res;
		HttpServletRequest request = (HttpServletRequest) req;
		Object session = RedisHelper.get(SysGlobalConstants.SESSIONID.concat(request.getSession().getId()));
		String uri = request.getRequestURI().toLowerCase();
		if (StringUtils.isEmpty(session) && uri.indexOf("login") < 0 && uri.indexOf("logout") < 0) {
			String header = ((HttpServletRequest)req).getHeader("x-requested-with");
			if(!StringUtils.isEmpty(header) && header.equalsIgnoreCase("XMLHttpRequest")) { // ajax请求 
				  response.setHeader("sessionstatus", "timeout");
				  
			}else {
				response.setContentType("text/html;charset=UTF-8");
				response.getWriter()
						.println("<script language='javascript'>if(window.opener==null){window.top.location.href='"
								+ rootPath + "';}else{window.opener.top.location.href='" + rootPath
								+ "';window.close();}</script>");
			}
		} else {
			chain.doFilter(req, res);
		}
	}

ajax请求并没有停止本身的处理过程,还会继续,又请求不到数据,就会一直报undefined错误。后来干脆不再区分是否是ajax请求,都加上header,都用response输出内容,就能正常执行了。js也不是很好,不太明白原理,先记下,希望有朝一日能搞清楚吧^_^

© 著作权归作者所有

lost_keke
粉丝 15
博文 34
码字总数 17914
作品 0
深圳
程序员
私信 提问
session过期后自动跳转到登陆页

项目需要做一个自动登出的功能,查询了网上的资料,一开始准备用session监听做,按照下面方式配置监听器 1.在项目的web.xml文件中添加如下代码: <!--添加Session监听器--><listener><liste...

零度的魚
2014/08/04
21K
1
php session在页面跳转后丢失

今天写页面时,使用了session 设置session后 跳转页面session就丢失 上网查了一下也没有很好的解决办法 也没有说原因。 在自己本地电脑上写了两个页面测试一下,完全正常。但是上传到服务器上...

wwwmmm
2012/06/18
705
5
执行addELResolver报错问题

@JFinal 你好,想跟你请教个问题: 我写了一个通用的SessionHandler,用于处理检验登录超时、和处理不需要进行权限校验的直接跳转的一些功能; 现出现了一个问题,在页面Session失效后,点击...

TerryZ
2014/12/08
258
2
关于支付宝return_url和notify_url通知顺序问题【详细区别】

问题描述: 我在处理支付宝业务中出现过这样的问题,付费完成后,在支付宝跳转到商家指定页面时,订单状态已经更新,通过调试发现是支付宝先通知notify_url,完成了订单状态。 支付宝returnu...

T_kress
10/10
8
0
https跳转到http session丢失问题

http>https>http session是不会丢失的。 这个就是用户登录时候通过http访问了首页,或者页面,然后点击登录按钮,跳转到https协议下,输入完毕用户名密码等信息,登录录成功,在服务端sessi...

山哥
2016/05/05
589
0

没有更多内容

加载失败,请刷新页面

加载更多

一起来学Java8(三)——方法引用

在一起来学Java8(一)——函数式编程中有一个简单的函数式编程的例子: import java.util.function.Consumer;class Person { public static void sayHello(String name) { S...

猿敲月下码
15分钟前
8
0
读书笔记:深入理解ES6(十一)

第十一章 Promise与异步编程   Promise可以实现其他语言中类似Future和Deferred一样的功能,是另一种异步编程的选择,它既可以像事件和回调函数一样指定稍后执行的代码,也可以明确指示代码...

张森ZS
38分钟前
13
0
面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
46分钟前
27
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
51分钟前
19
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
59分钟前
18
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部