关于使用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>
关于使用struts2时子窗体页面跳转后在父窗体打开的问题以及Session过期后的页面跳转问题的更多相关文章
- silverlight子窗体操作数据库后刷新父窗体
silverlight子窗体操作数据库后刷新父窗体 作者 Kant 写于 2011 年 07 月 02 日 分类目录 学习笔记, 所有文章 C# Silverlight 代码 刷新 学习 异步刷新 数 ...
- MVC 访问IFrame页面Session过期后跳转到登录页面
Web端开发时,用户登录后往往会通过Session来保存用户信息,Session存放在服务器,当用户长时间不操作的时候,我们会希望服务器保存的Session过期,这个时候,因为Session中的用户信 ...
- session过期后iframe页面如何跳转到parent页面
session过期后如果在iframe里操作就会返回到login.html,可是这个页面还在iframe里面如果再次登陆就会出现iframe嵌套的现象,我们这样来解决. 在login.html里面加上 ...
- 当session过期后自动跳转到登陆页而且会跳出iframe框架
写项目时在重定向后一直存在一个问题就是重定向后登陆页面会出现在跳出的子框架里.
- SNF快速开发平台MVC-EasyUI3.9之-Session过期处理和页面请求筛选
Session引发的异常 其中一个bug是这样的: 使用Firefox登录进入系统后,再打开一个Tab,进入系统页面,点击logout. 在回到前一个tab页面,点击Save按钮,出现了js错误.这个 ...
- session过期返回登录页面跳出frame
session 过期返回登录页面 方法1, HttpSession session = request.getSession(); String LOGIN_ID = (String) session ...
- Session过期后自动跳转到登录页面的实例代码
1.在项目的web.xml文件中添加如下代码: ? 1 2 3 4 <!--添加Session监听器--> <listener> <listener-class> ...
- 20150812 Asp.net 父窗体获取子窗体的返回值,更新父窗体文本控件(应用)
1. 父窗体 **************************************** using System;using System.Collections;using System.C ...
- Session过期后自动跳转到登录页面
最近研究如果用原生的Filter来判别session存在否或者过期否.来跳转到的页面实例,下载来展示代码. 因为顾虑器是每次请求能会进入的,所以可以设置了,进行拦截判断 1.配置web.xml < ...
随机推荐
- C# socket UDPの异步链接
基于C#的UDP异步连接,在本机上通过测试
- BZOJ 1834 【ZJOI2010】 network 网络扩容
Description 给定一张有向图,每条边都有一个容量C和一个扩容费用W.这里扩容费用是指将容量扩大1所需的费用.求: 1. 在不扩容的情况下,1到N的最大流: 2. 将1到N的最大流增加K所需的 ...
- codevs2693 上学路线(施工)
难度等级:黄金 2693 上学路线(施工) 题目描述 Description 问题描述 你所在的城市街道好像一个棋盘,有a条南北方向的街道和b条东西方向的街道. 南北方向a条街道从西到东依次编号为1到 ...
- win10下 解决系统进程占用80端口
公司电脑从win7升级到win10,无法启动nginx,日志里输出:2016/05/30 09:26:01 [emerg] 7024#5440: bind() to 0.0.0.0:80 failed ...
- 给Asp.Net MVC及WebApi添加路由优先级
一.为什么需要路由优先级 大家都知道我们在Asp.Net MVC项目或WebApi项目中注册路由是没有优先级的,当项目比较大.或有多个区域.或多个Web项目.或采用插件式框架开发时,我们的路由注册很可 ...
- DOM之表格与表单基础分享
我是沐晴,好久不见.马上要放假啦,也是比较的忙. 今天来谈谈表格和表单的基本知识.前期的写的都是比较基础的知识,后期会慢慢增加实例.一起来学习吧. 先看表格,DOM中提供了一些属性,便于我们获取表单节 ...
- sql 几点记录
1 With子句 1.1 学习目标 掌握with子句用法,并且了解with子句能够提高查询效率的原因. 1.2 With子句要点 with子句的返回结果存到用户的临时表 ...
- 无线AP和无线路由器区别
无线AP,即Access Point,也就是无线接入点.简单来说就是wifi共享上网中的无线交换机,它是移动终端用户进入有线网络的接入点. AD:51CTO技术沙龙 | 赋予APP不同凡响的交互和体验 ...
- C# 控制台程序实现 Ctrl + V 粘贴功能
代码主要分为两部分,首先调用系统API注册剪切板相关的事件,然后监控用户的按键操作.完整代码如下: class ClipBoard { [DllImport("user32.dll" ...
- 简易版viewport
首先这里涉及到虚拟像素和物理像素,不管是移动设备还是pc都存在这个概念1.在显示器精度还不是很高的年代,一个物理像素就等于一个虚拟像素,1000px的网页就占据了1000的物理像素(如果你玩过小霸王, ...