关于使用struts2时子窗体页面跳转后在父窗体打开的问题以及Session过期后的页面跳转问题

问题1:传统的系统界面,iframe了三个页面,上,左,右,用户点击注销的按钮在上面得top.jsp里面,方法:<a href="../adminAction/admin_logout.action">退出系统</a>退出之后你会发现,只是刷新了top.jsp上面那个iframe,其他两个还在,如何解决?

解决办法: target="_top",就就是它。加多这个变成:<a href="../adminAction/admin_logout.action" target="_top">退出系统</a> 就行了!

将adminAction的logout方法返回的逻辑结果直接配置到登陆页面(loginUI.jsp)。然后在登陆页面输出提示信息,(该提示信息由logout方法赋值,比如:tip="已成功退出系统!";)

AdminAction的logout方法

public String logout() throws Exception {
        javax.servlet.http.HttpSession session = ServletActionContext.getRequest().getSession();
        session.removeAttribute("adminid");
        session.removeAttribute("adminName");
        session.removeAttribute("limit");
        session.invalidate();
        tip="已成功退出系统!";
        return "loginUI";
}

登陆页面(loginUI.jsp)中弹出提示信息

<!-- 显示提示信息 -->
<s:if test="#request.tip != null">
    <script type="text/javascript">alert("<s:property value="#request.tip" />");</script>
</s:if>

补充:

<a href="http://www.google.com" target="external">打开一个新窗口</a>

target其他各属性值的含义:

_blank:新建窗口

_self:相同窗口

_parent:父窗口

_top:首窗口

注:最好使用target="_top" ,因为如果页面发生其他跳转 如:window.parent.frames[‘name‘].location.href = url;等操作。target="_parent" 无效仍然刷新top上的那个iframe。

问题2:当一段时间session过期后,点击任意一个子页面,会连续地弹出几个对话框,提示“session过期,请重新登陆”,我只希望弹出一个对话框就好了,如何解决?

分析:

为什么会连续地弹出几个对话框?

因为<iframe src=""></iframe>中src属性会导致发送另外一次请求,因为整个页面布局中有多个这样的iframe,所以会发送多次请求,而每个请求都会先被拦截,然后一看session无效,于是就弹出对话框提示“session过期,请重新登陆”。

解决办法:本来之前的拦截器中是这样的逻辑:当session无效时就直接返回到登陆页面,并弹出提示信息。现在改为,当session无效时先跳转到另外一个中间页面(比如sessionTimneout.jsp),然后再从该中间页面跳转到登陆页面,并弹出提示信息。

拦截器类:

package com.chance.util;

import java.util.Map;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;

public class AuthorityInterceptor extends AbstractInterceptor{

         @Override
        public String intercept(ActionInvocation invocation) throws Exception {  

            ActionContext cx = ActionContext.getContext();
            Map session = cx.getSession();
            String namespace = invocation.getProxy().getNamespace();
            String actionName = invocation.getProxy().getActionName();  

            if(("/".equals(namespace) && "admin_login".equals(actionName)) ||
                    ("/".equals(namespace) && "admin_loginUI".equals(actionName))){
                return invocation.invoke();
            } else {  

                String adminName = (String) session.get("adminName");

                if(adminName != null){
                    return invocation.invoke();
                }
                else{

                    //将提示信息放到session范围内
                    session.put("sessionTimneoutTip", "session已经过期,请重新登陆!");
                    //这里不是直接return "loginUI"; 由于页面嵌套在iframe下,跳转时需要跳转到其父页面,因此加个中间的sessionTimneout.jsp,拦截器配置跳转到此页面,再由此页面跳转到登录页面。
                    return "sessionTimneout";

                }
            }
        }
}

中间页面sessionTimneout.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">

  </head>

  <body>
  <!-- 由于页面嵌套在iframe下,跳转时需要跳转到其父页面,因此加个中间的jsp,拦截器配置跳转到此页面,再由此页面跳转到登录页面。 -->
    <script language=‘javascript‘>top.location.href=‘${pageContext.request.contextPath}/admin_loginUI.action‘;</script>

  </body>
</html>

登陆页面(loginUI.jsp)提示信息

<!-- 显示session过期的提示信息 -->
<s:if test="#session.sessionTimneoutTip != null">
    <script type="text/javascript">alert("<s:property value="#session.sessionTimneoutTip" />");</script>
    <% session.removeAttribute("sessionTimneoutTip");%>
</s:if>
时间: 2024-08-05 05:09:58

关于使用struts2时子窗体页面跳转后在父窗体打开的问题以及Session过期后的页面跳转问题的相关文章

MVC 访问IFrame页面Session过期后跳转到登录页面

Web端开发时,用户登录后往往会通过Session来保存用户信息,Session存放在服务器,当用户长时间不操作的时候,我们会希望服务器保存的Session过期,这个时候,因为Session中的用户信息取不到了,就需要用户重新登录,重新保存Session. Asp.net MVC提供了过滤器,让我们可以很方便的控制访问Action时要处理的事情,针对Session过期后页面跳转,我们可以封装一下Controller的OnActionExecuting方法作为基Controller,如下: pub

WinForm 子窗体在父窗体范围内移动,不能出父窗体 摘自于网络

详细解释:1, 主窗体Form1属性IsMdiContainer设为True,并添加ToolStrip控件, Toolstrip中添加一个按钮toolStripButton1.         2,添加新窗体Form2.           3,主窗体Form1中toolStripButton1的Click事件           private void toolStripButton1_Click(object sender, EventArgs e)         {          

session过期后自动跳转到登陆页

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

当session过期后自动跳转到登陆页而且会跳出iframe框架

写项目时在重定向后一直存在一个问题就是重定向后登陆页面会出现在跳出的子框架里. 解决方法: 在登陆界面的<body></body>里加上 1 <script type="text/javascript"> 2 //session过期后刷新父页面 3 if (window != top) 4 top.location.href = location.href; 5 </script> 即可跳出iframe框架

解决session过期后登录页面嵌套在框架中的问题

只要在登录页面中加入一下脚本即可: <script language="text/javascript"> //在嵌套时,就刷新上级窗口 if(window.parent!=window){ window.parent.location.reload(true); } </script> 解决session过期后登录页面嵌套在框架中的问题,布布扣,bubuko.com

session过期返回登录页面跳出frame

session 过期返回登录页面 方法1, HttpSession session = request.getSession(); String LOGIN_ID = (String) session.getAttribute("LOGIN_ID"); if (null == LOGIN_ID||"".equals(LOGIN_ID)) { java.io.PrintWriter out = response.getWriter(); out.println(&qu

获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄

原文:获取当前进程(程序)主窗体句柄并设置wpf的父窗体为此句柄 有时候在c++调用wpf控件的时候,wpf控件想自己显示窗体,但需要设置owner属性.迂回解决办法是设置wpf的window窗体的父窗体为进程的句柄. 1.获取当前进程id int id = Process.GetCurrentProcess().Id; 2.根据进程id获取进程主句柄 public static class ProcessHelper { private static class Win32 { interna

20150812 Asp.net 父窗体获取子窗体的返回值,更新父窗体文本控件(应用)

1. 父窗体 **************************************** using System;using System.Collections;using System.Configuration;using System.Data;using System.Linq;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using

SSH系列:(21)Session过期,登录页面嵌套的问题

在系统中使用了frameset,当前用户的系统登录信息失效后:如果再点击左边的菜单,那么在右边的显示登录页面,而正确的应该是整个页面返回到登录页. 解决这个问题:应该在跳转到登录页面中使用js脚本判断,是否当前页面在框架内,即当前页面的窗口是否是顶级窗口,如果是子窗口的话:可以直接刷新父窗口的地址则会自动地整个页面跳转为登录页. <scripttype="text/javascript">          if(window!= window.parent){