后台重定向传递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>");