zoukankan      html  css  js  c++  java
  • 关于使用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>
  • 相关阅读:
    强制开启Android webview debug模式
    JavaScript DOM操作案例自定义属性的设置跟获取
    JavaScript innerText跟innerHTML的区别
    JavaScript DOM操作案例封装innerText跟textContent函数(浏览器兼容)
    JavaScript其他获取元素的方式
    JavaScript DOM操作案例根据类样式的名字获取元素
    JavaScript DOM操作案例根据name属性获取元素
    Java throws 使用
    理解 Android Build 系统
    理解Android编译命令
  • 原文地址:https://www.cnblogs.com/tsiangleo/p/4241434.html
Copyright © 2011-2022 走看看