阅读:152114回复:1
关于解决session过期自动跳转首页问题中遇见的问题
发这个问题是在解决 http://bbs.hearker.com/read.php?tid=2206&fid=14 这个问题中遇见的问题。
先说一下解决思路。 1、平台中session过期之后如果再操作数据查询,控制台会有如下提示 图片:1.jpg 可以看出所有的数据查询都是以.svt结尾的请求。 2、打开web.xml 图片:3.jpg 可以发现请求都会先经过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会有包冲突之类问题,就没有深入下去了。 |
|
沙发#
发布于:2017-05-09 09:10
session过期页面自动跳转分为很多种情况,首先需要确定一下跳转到首页还是弹出登录提示框:
A:如果是跳转到首页只需要添加一个拦截器,在拦截器中判断请求用户是否匿名访问(未登录)如果没登录将chain定向到首页即可。 B:如果需要弹出登录提示框,那么就需要考虑页面Session过期之前的局部刷新,比如登录后继续加载之前未加载完的异步树数据。那登录操作就需要在前台用Ajax调用系统后台进行判断,然后再调用Seam自带后台登录组件重新登录(期间需要用到隐藏的登录提交表单) |
|
|