王毅成
骑士
骑士
  • UID103
  • 粉丝2
  • 关注0
  • 发帖数30
  • 社区居民
阅读:152114回复:1

关于解决session过期自动跳转首页问题中遇见的问题

楼主#
更多 发布于:2016-11-13 11:40
发这个问题是在解决 http://bbs.hearker.com/read.php?tid=2206&fid=14 这个问题中遇见的问题。
先说一下解决思路。
1、平台中session过期之后如果再操作数据查询,控制台会有如下提示

图片:1.jpg



可以看出所有的数据查询都是以.svt结尾的请求。
2、打开web.xml

图片:3.jpg

K

可以发现请求都会先经过SeamFilter过滤,然后再经过SystmPageFilter,所以猜测后台输出的提示在SystemPageFilter中。所以准给在这两个拦截之前定义一个拦截.svt结尾的Filter来处理session过期后的数据请求,如果session没有过期则将请求继续传递至SeamFilter,如果session过期,向前台输出js代码进行页面跳转控制(ajax请求无法重定向)。如下图

图片:4.jpg



实现类
package com.sunsheen.filter;


import java.io.IOException;
import java.io.PrintWriter;


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.jboss.seam.servlet.SeamFilter;


import com.sunsheen.jfids.system.security.login.Session;
import com.sunsheen.jfids.system.servlet.SystemPageFilter;


public class DataFilter implements Filter {


 @Override
 public void destroy() {
 // TODO Auto-generated method stub
 
 }


 @Override
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {
       System.out.println("------------svt过滤--------------");
      
       HttpServletRequest req=(HttpServletRequest)request;
       HttpServletResponse res=(HttpServletResponse)response;
       if(req.getHeader("x-requested-with")!=null  && req.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){  
        PrintWriter out = res.getWriter();
      out.println("<script language='javascript'>alert('会话过期,请重新登录');</script>");
   out.flush();
   out.close();
       }      
 
 }


 @Override
 public void init(FilterConfig arg0) throws ServletException {
 // TODO Auto-generated method stub
 
 }


}
现在来说遇见的问题:就是

  PrintWriter out = res.getWriter();
      out.println("<script language='javascript'>alert('会话过期,请重新登录');</script>");
   out.flush();
   out.close();
这段代码没有起作用,这个是什么原因呢?希望懂得起的同事能够解惑。


PS:也换过思路来解决session过期问题,比如websocket,session创建时候,建立通信将其加入集合,然后session销毁时候,后台监测出,定位出是哪个session,然后向对应前台发出提示。但是貌似平台用websocket会有包冲突之类问题,就没有深入下去了。

最新喜欢:

向浩向浩 何万里何万里 梅钲琪梅钲琪
周进
风云使者
风云使者
  • UID2
  • 粉丝15
  • 关注12
  • 发帖数264
  • 社区居民
  • 最爱沙发
  • 忠实会员
  • 原创写手
沙发#
发布于:2017-05-09 09:10
session过期页面自动跳转分为很多种情况,首先需要确定一下跳转到首页还是弹出登录提示框:
A:如果是跳转到首页只需要添加一个拦截器,在拦截器中判断请求用户是否匿名访问(未登录)如果没登录将chain定向到首页即可。
B:如果需要弹出登录提示框,那么就需要考虑页面Session过期之前的局部刷新,比如登录后继续加载之前未加载完的异步树数据。那登录操作就需要在前台用Ajax调用系统后台进行判断,然后再调用Seam自带后台登录组件重新登录(期间需要用到隐藏的登录提交表单
世上本没有路,走的人多了,便变成了路.
游客

返回顶部