action重定向到frameset页面指定target属性

本文介绍了解决Struts2项目中Frameset页面注销登录后重定向的问题。通过分析无效方法的原因,最终采用服务器端回写JavaScript代码的方式实现_top窗口的登录页面重定向。

后台重定向传递frameset页面target属性

一、问题描述

使用struts2的项目,在frameset前端页面的顶部窗口有个注销登录的链接,点击该链接,后台将清除session保存的用户信息,并且将页面重定向到登录页面。

二、尝试的无效方法

2.1 struts2的result标签

使用struts2的result标签,登录页面始终只出现在页面顶部,其他部位不变

<!--无效代码-->
<result name="logout_success" type="dispatcher">/login.jsp</result>

或者

<!--无效代码-->
<result name="redirect" type="dispatcher">/login.jsp</result>

2.2 action中直接重定向

在action中获取到Servlet的response对象,使用sendRedirect()方法,问题仍然没办法解决。

//无效代码
ServletActionContext.getResponse().sendRedirect("login.jsp");

三、发现原因

frameset的target属性是用于指定页面跳转的方式,比如:

属性值描述
_blank默认,在新窗口中打开被链接文档
_self在相同的框架中打开被链接文档
_parent在父框架集中打开被链接文档
_top在整个窗口中打开被链接文档
framename在指定的框架中打开被链接文档

前面的方法都无效,问题在于:
target是客户端的属性,因此只能在客户端指定,和服务器端没有任何关系,所以servlet和struts2都没法直接指定target属性。

四、解决办法

如果一定要后台控制窗口的显示方式,只能通过间接的方式。通过使用servlet的response方法想页面直接回写javascript代码,回写完成后,页面会立即执行js代码。js是客户端的语言,因此可以控制target值。

//有效的解决方案
HttpServletResponse response = ServletActionContext.getResponse();
response.getWriter().write("<script>window.open('login.jsp','_top')</script>");
### 前端实现页面跳转的方法 在前端开发中,有多种方式可以实现页面跳转。以下是常见的几种方法及其具体应用: #### 1. 使用 HTML 的 `<a>` 标签 `<a>` 标签是最基础也是最常见的页面跳转方式之一。通过 `href` 属性指定目标 URL 来完成跳转操作。 ```html <!-- 跳转至外部链接 --> <a href="https://www.example.com">访问 Example 网站</a> <!-- 页面内的锚点跳转 --> <a href="#section1">跳转到 Section 1</a> <!-- 跨页面的锚点跳转 --> <a href="page2.html#section2">跳转到 page2 的 Section 2</a> ``` 这种方法简单直观,适用于大多数基本需求[^1]。 #### 2. 利用 JavaScript 实现页面跳转 JavaScript 提供了几种不同的方法来控制页面跳转行为,主要涉及 `window.location` 对象以及 `window.open()` 方法。 ##### (1) 修改 `window.location.href` 此方法会替换当前窗口中的内容并导航到新的 URL 地址。 ```javascript // 替换当前页面为新地址 window.location.href = 'https://www.example.com'; ``` 这种方式适合于单层结构或者 iframe 内部页面之间的切换[^2]。 ##### (2) 设置 `top.window.location.href` 当存在框架集(frameset)或嵌入式 iframe 时,如果希望整个浏览器加载一个新的顶级文档而不是仅仅更新某个子帧,则需采用如下形式: ```javascript // 强制刷新顶层窗口的内容 top.window.location.href = 'https://www.example.com'; ``` 这种技术能够有效突破某些安全限制下的跨域问题,并且不会触发弹窗阻止器的工作机制[^2]。 ##### (3) 应用 `window.open()` 对于需要新开标签页显示的情况,推荐使用 `window.open()` 函数创建独立浏览环境。 ```javascript // 打开新窗口/选项卡展示目标站点 window.open('https://www.example.com', '_blank'); ``` 注意这里的第二个参数决定了打开模式,默认值 `_self` 表明在同一框内加载;而 `_blank` 将启动全新空白区域装载资源[^2]。 #### 3. Form 表单提交后的重定向 表单控件也支持配置属性以决定其动作执行完毕之后的行为方向。比如默认情况下,表单成功处理后会使原请求发起者所在网页发生变动;但如果设置了特殊的目标指示符,则会产生不一样的效果。 | Target Value | Description | |--------------|---------------------------------------------------------------------------| | _self | 默认值,在相同的 Frame 或 Window 加载响应数据 | | _blank | 新建 Tab/Page 显示服务器返回的信息 | | _parent | 如果当前位于 Iframe 中,则父级容器成为接收方 | | _top | 不管任何层次关系,总是让最高级别的 Browser Context 接收最终结果 | 示例代码片段如下所示: ```html <form action="/submit" method="post"> <!-- ... --> </form> <form action="/submit" method="post" target="_blank"> <!-- ... --> </form> <form action="/submit" method="post" target="_parent"> <!-- ... --> </form> <form action="/submit" method="post" target="_top"> <!-- ... --> </form> ``` 以上四种情况分别对应不同类型的用户体验设计思路[^3]。 #### 4. Meta Refresh 技术 最后一种较为古老但仍被广泛使用的手段就是依靠 HTTP 头信息里的 refresh 参数配合定时功能达成自动化流程管理目的。虽然现代 Web 开发更倾向于 AJAX 动态交互模型,但在特定场合下仍不失为可行的选择方案之一。 ```html <meta http-equiv="refresh" content="5; url=https://www.example.com/" /> ``` 在此例子中,“5”代表等待五秒钟后再转向指定链接位置。值得注意的是,过度依赖此类做法可能会降低用户的满意度因为缺乏即时反馈特性[^4]。 综上所述,开发者可以根据实际项目需求灵活选用上述任意一类或多类组合策略达到理想的效果展现标准。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值