session超时跳出frame -- 过滤未登录的用户LoginFilter

session超时跳出frame
今天遇到session超时跳转后还在frame框架里面,得想办法跳出frame后转到登录页面去。
方法一:
js解决方案:
    $(document).ready(function(){
        if (window != top){
            top.location.href = "login.action";
            //或者top.location=self.location;这种方法其实也是对self.location的当前action进行第二次请求
        }
    });
缺点:会产生两次请求,如果网速过慢,用户可以看到两次在登录页面上的跳转。


方法二:
思路:任何未登录/超时跳转--》index_proxy.html登录代理跳转页面--》login.action--》跳转登录页面
java程序解决:
首先:在web.xml里面配置过滤器
    <filter>
        <filter-name>login</filter-name>
        <filter-class>com.newyulong.iptv.webapp.filter.LoginFilter</filter-class>
        <init-param>
            <param-name>loginActionUrl</param-name>
            <param-value>/login.action</param-value>
        </init-param>
        <init-param>
            <param-name>loginUrl</param-name>
        <!--下面是未登录跳转和超时跳转代理页面-->
            <param-value>/index_proxy.html</param-value> 
        </init-param>
    </filter>
其次编写过滤器:
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 com.SessionUtil;

public class LoginFilter implements Filter{
    private String loginUrl;
    private String loginActionUrl;

    @Override
    public void destroy() {   
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        //判断用户是否已经登录
        HttpServletRequest httpServletRequest = (HttpServletRequest)request;
        HttpServletResponse servletResponse  = (HttpServletResponse)response;
        //需要登录的东西不能被浏览器缓存
        servletResponse.setHeader("Pragma","No-cache");
        servletResponse.setHeader("Cache-Control","no-cache");  
        servletResponse.setDateHeader("Expires", -10);
        String appPath= httpServletRequest.getServletPath();
        if(!appPath.equalsIgnoreCase(loginUrl)&&!appPath.equalsIgnoreCase(loginActionUrl)&&!SessionUtil.exist(httpServletRequest, SessionUtil.USER_SESSION_NAME)){           
            servletResponse.sendRedirect(httpServletRequest.getContextPath()+loginUrl);
            return ;
        }
        chain.doFilter(request, response);   
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String _loginUrl = filterConfig.getInitParameter("loginUrl");
        if(_loginUrl!=null)
            loginUrl = _loginUrl;
        String _loginActionUrl=filterConfig.getInitParameter("loginActionUrl");
        if(_loginActionUrl!=null)
            loginActionUrl=_loginActionUrl;   
    }
}

过滤器里面引用到的session处理类:
import javax.servlet.http.HttpServletRequest;

import SystemUser;  //用户实体
import ValidateCodeServlet;  //验证码处理类

public class SessionUtil {
   
    public static final String USER_SESSION_NAME=SystemUser.class.getName();
    public final static String VALIDATE_CODE_KEY = ValidateCodeServlet.class.getName();
   
    public static void set(HttpServletRequest request,String name,Object val){
        request.getSession().setAttribute(name, val);
    }
   
    public static boolean exist(HttpServletRequest request,String name){
        return request.getSession().getAttribute(name)!=null;
    }
    public static Object get(HttpServletRequest request,String name){
        return request.getSession().getAttribute(name);
       
    }
   
    public static boolean destroy(HttpServletRequest request,String name){
        if(exist(request,name)){
            request.getSession().removeAttribute(name);
            return true;
        }
        return false;
    }
}


最后是代理页面index_proxy.html:
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>IPTV - BSS</title>
<link href="css/general_cn.css" rel="stylesheet" type="text/css">
<script type="text/javascript" src="js/jquery-1.3.2.min.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        //top.location=self.location;  //此种写法会产生velocity错误,html跳html
        //$('#loginform').submit();
        top.location.href = "login.action";
    });
</script>
<body style="background-color:#F0F0F0;">
<form action="login.action" name="loginform" id="loginform" method="post" >
</form>
</body>
</html>

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2011-04-13 10:40  cuker919  阅读(197)  评论(0编辑  收藏  举报