iframe和response.sendRedirect使用的问题
一、iframe下使用response.sendRedirect的问题
一般使用filter过滤用户是否登录,如果用户没有登陆则转向登陆页面,这时候可以使用response.sendRedirect()。
但当在页面上使用了iframe后,发现被重定向的只是父页面中的iframe区域,登陆页面内容显示在该区域中。说明在过滤器中发送重定向请求时,是在iframe页面发送的。错误的代码如下:
- HttpServletRequest req = (HttpServletRequest) request;
 - Visitor visitor = (Visitor) req.getSession().getAttribute("visitor");
 - if (visitor == null)
 - {
 - ((HttpServletResponse) response).sendRedirect("/smpc/login/login.jsp");
 - }
 - chain.doFilter(request, response);
 
因为response.sendRedirect()没有target属性,但html页面和js中有,于是,当判断出用户没有访问权限时,我们可以在jsp中使用js来转向到真正的登录页面。在filter类的doFilter方法中添加如下代码:
- HttpServletRequest req = (HttpServletRequest) request;
 - Visitor visitor = (Visitor) req.getSession().getAttribute("visitor");
 - if (visitor == null)
 - {
 - java.io.PrintWriter out = response.getWriter();
 - out.println("<html>");
 - out.println("<script>");
 - out.println("window.open ('/smpc/login/login.jsp','_top')");
 - out.println("</script>");
 - out.println("</html>");
 - }
 - chain.doFilter(request, response);
 
解决乱码问题:
String CONTENT_TYPE = "text/html; charset=GBK";
    httpServletResponse.setContentType(CONTENT_TYPE);
out.println("alert('您所登录的用户已在其他机器登录,您被迫下线!');");
二、使用response.sendRedirect的注意点
使用response.sendRedirect时就需要注意以下两点:
1,在使用response.sendRedirect时,前面不能有HTML输出。
这并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的HTML输出也是允许的。
如果报错说,“一些信息已经被submitted”(原文忘了),那么,你就要注意看了,前面是不是有过多的HTML输出了。
2,在response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。
3.重定向到的jsp页面的路径需要设置正确,可以用绝对路径:String path = httpReq.getContextPath() + "/login.jsp";
iframe和response.sendRedirect使用的问题的更多相关文章
- iframe和response.sendRedirect()跳转到父页面的问题
		
在项目中,因为为了给页面分层次,就使用了 内嵌iframe 的分了三个框.在子页面进行操作的时候,如果session超时,就要被拦截器拦截重新回到首页进行登录,但是在sub页 面 ,进行操作的时候,如 ...
 - Servlet中response.sendRedirect()跳转时不能设置target的解决办法
		
一般使用Struts2的拦截器(或者是filter)验证是否登录的时候,如果用户没有登录则会跳转到登录的页面.这时候一般可以在拦截器或者filter中用response.sendRedirect(). ...
 - response.sendRedirect()与request.getRequestDispatcher().forward()区别
		
Servlet中response.sendRedirect()与request.getRequestDispatcher().forward(request,response)这两个对象都可以使页面跳 ...
 - response.sendRedirect的细节
		
今天敲书上的例子的时候无意间发现,response中的sendRedirect()重定向到另一个servlet时,调用的是doget方法,不明所以,百度得知,原来还牵扯到http协议的细节问题,原文如 ...
 - request.getRequestDispather().forward()与response.sendRedirect()
		
request.getRequestDispather().forward(),是服务器端的跳转,地址栏无变化. response.sendRedirect()是客户端的跳转,地址栏发生变化.
 - 关于jsp中response.sendRedirect显示错误
		
今天在jsp中作判断时,当不同条件时利用response.sendRedirect(“url”)来转向不同的页面,首先是判断验证码,当错误时就转向错误页面:当正确时,才进行用户名和密码的判断,同样也r ...
 - 转发(request.setRequestDispacter)和重定向(response.sendRedirect)的区别以及转发的include和forward的区别
		
//response 重定向的时候,url是会跳转到新的页面的,输入的地址要包含项目名(可以跳到项目之外的页面,比如百度)//request 请求转发的时候,url是不会跳转到新页面的,输入的地址不包 ...
 - jsp:forward   response.sendRedirect
		
jsp中<jsp:forward page=""/>和response.sendRedirect("")两种跳转的区别 一.response.sen ...
 - response.sendRedirect()重新定向的乱码问题
		
这里response.sendRedirect("YPbianhaoModify.jsp?jinhuoshang="+jinhuoshang+"&jinhuori ...
 
随机推荐
- PHP数组相加
			
+ 运算符把右边的数组元素(除去键值与左边的数组元素相同的那些元素)附加到左边的数组后面,但是重复的键值不会被覆盖 ,array_merge()此时会覆盖掉前面相同键名的值 如: $a=array(' ...
 - IOS流媒体播放
			
IOS流媒体播放 1. 这里的流媒体地址是指服务端那边已经调好格式的可以在ios上播放的视频流. 下面提供几个视频流的地址: NSString *linkStr = http://61.160.2 ...
 - (摘)ORACLE DBA的职责
			
ORACLE数据库管理员应按如下方式对ORACLE数据库系统做定期监控: (1). 每天对ORACLE数据库的运行状态,日志文件,备份情况,数据 库的空间使用情况,系统资源的使用情况进行检查,发现并解 ...
 - NGINX实现IF语句里的AND,OR多重判断
			
原理 就是用SET变量进行. AND 就用变量叠加,OR就用0或1切换. nginx的配置中不支持if条件的逻辑与/逻辑或运算 ,并且不支持if的嵌套语法,我们可以用变量的方式来实现: 首先是伪代码( ...
 - QDialog 模态对话框与事件循环(exec其实就是调用了show和eventLoop.exec)
			
起源 qtcn中文论坛中有网友问到: 假设程序正常运行时,只有一个简单的窗体A,此时只有一个GUI主线程,在这个主线程中有一个事件循环处理窗体上的事件.当此程序运行到某阶段时,弹出一个模态窗体B(书上 ...
 - WCF服务实现客户端Cookie共享,表单验证的解决方案
			
基于前几篇的文章,如果理解了通道 拦截器 服务转发的概念,相信你肯定也能理解咋的玩了. 说白了就是创建客户端的拦截器: 实现接口:IClientMessageInspector. 里面的方法就是客户 ...
 - BZOJ1089: [SCOI2003]严格n元树
			
1089: [SCOI2003]严格n元树 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 762 Solved: 387[Submit][Status ...
 - 转:Android 测试 Appium、Robotium、monkey等框架或者工具对比
			
原文地址:http://demo.netfoucs.com/u012565107/article/details/36419297# 1. Appium测试 (功能测试,用户接受度测试,黑盒测试) - ...
 - 【转】Ubuntu命令行下安装、卸载、管理软件包的方法
			
原文网址:http://oss.org.cn/html/47/n-67447.html 一.Ubuntu中软件安装方法 1.APT方式 (1)普通安装:apt-get install softname ...
 - glibc的了解,对内核的封装
			
glibc除了提供最底层的C运行库,还封装了kernel提供的API,程序通过glibc进行系统调用( syscall). 应用层面的C库,比如OpenSSL库: /usr/include/opens ...