jsp response.sendRedirect不跳轉(zhuǎn)的原因分析及解決
更新時(shí)間:2013年07月08日 17:36:52 作者:
最近做項(xiàng)目時(shí)遇到一個(gè)問(wèn)題,明明加了response.sendRedirect() ,系統(tǒng)也執(zhí)行了,但是它就是不跳轉(zhuǎn),具體的原因如下,感興趣的各位可以參考下哈,希望對(duì)大家有所幫助
最近做項(xiàng)目時(shí)遇到一個(gè)問(wèn)題,明明加了response.sendRedirect() ,系統(tǒng)也執(zhí)行了,但是它就是不跳轉(zhuǎn);最后在網(wǎng)上找到原因如下:
首先我們要明白用response.sendRedirect做轉(zhuǎn)向的原理,它其實(shí)是向?yàn)g覽器發(fā)送一個(gè)特殊的Header,然后由瀏覽器來(lái)做轉(zhuǎn)向,轉(zhuǎn)到指定的頁(yè)面,所以用sendRedirect時(shí),瀏覽器的地址欄上可以看到地址的變化。
用<jsp:forward page=""/>則不同,它是直接在server做的,瀏覽器并不知道,也不和瀏覽器打交道,這從瀏覽器的地址并不變化可以看出。
所以使用response.sendRedirect時(shí)就需要注意以下兩點(diǎn):
1、在使用response.sendRedirect時(shí),前面不能有HTML輸出。
這并不是絕對(duì)的,不能有HTML輸出其實(shí)是指不能有HTML被送到了瀏覽器。事實(shí)上現(xiàn)在的server都有cache機(jī)制,一般在8K(我是說(shuō)JSP SERVER),這就意味著,除非你關(guān)閉了cache,或者你使用了out.flush()強(qiáng)制刷新,那么在使用sendRedirect之前,有少量的HTML輸出也是允許的。
如果報(bào)錯(cuò)說(shuō),“一些信息已經(jīng)被submitted”(原文忘了),那么,你就要注意看了,前面是不是有過(guò)多的HTML輸出了。
2、在response.sendRedirect之后,應(yīng)該緊跟一句return;
我們已經(jīng)知道response.sendRedirect是通過(guò)瀏覽器來(lái)做轉(zhuǎn)向的,所以只有在頁(yè)面處理完成后,才會(huì)有實(shí)際的動(dòng)作。既然你已經(jīng)要做轉(zhuǎn)向了,那么后的輸出還有什么意義呢?而且有可能會(huì)因?yàn)楹竺娴妮敵鰧?dǎo)致轉(zhuǎn)向失敗。
<%@ include file="/page/checkLogin.jsp" %>這個(gè)放在要驗(yàn)證的頁(yè)面的第一句。
checkLogin.jsp 內(nèi)容是通過(guò)看session 里面有沒登陸用戶的內(nèi)容來(lái)判斷是否登錄, 如果沒有,那么跳轉(zhuǎn)到登陸頁(yè)面:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
if (session.getAttribute("userinfo") == null) {
response.sendRedirect(url);
return;
}
%>
首先我們要明白用response.sendRedirect做轉(zhuǎn)向的原理,它其實(shí)是向?yàn)g覽器發(fā)送一個(gè)特殊的Header,然后由瀏覽器來(lái)做轉(zhuǎn)向,轉(zhuǎn)到指定的頁(yè)面,所以用sendRedirect時(shí),瀏覽器的地址欄上可以看到地址的變化。
用<jsp:forward page=""/>則不同,它是直接在server做的,瀏覽器并不知道,也不和瀏覽器打交道,這從瀏覽器的地址并不變化可以看出。
所以使用response.sendRedirect時(shí)就需要注意以下兩點(diǎn):
1、在使用response.sendRedirect時(shí),前面不能有HTML輸出。
這并不是絕對(duì)的,不能有HTML輸出其實(shí)是指不能有HTML被送到了瀏覽器。事實(shí)上現(xiàn)在的server都有cache機(jī)制,一般在8K(我是說(shuō)JSP SERVER),這就意味著,除非你關(guān)閉了cache,或者你使用了out.flush()強(qiáng)制刷新,那么在使用sendRedirect之前,有少量的HTML輸出也是允許的。
如果報(bào)錯(cuò)說(shuō),“一些信息已經(jīng)被submitted”(原文忘了),那么,你就要注意看了,前面是不是有過(guò)多的HTML輸出了。
2、在response.sendRedirect之后,應(yīng)該緊跟一句return;
我們已經(jīng)知道response.sendRedirect是通過(guò)瀏覽器來(lái)做轉(zhuǎn)向的,所以只有在頁(yè)面處理完成后,才會(huì)有實(shí)際的動(dòng)作。既然你已經(jīng)要做轉(zhuǎn)向了,那么后的輸出還有什么意義呢?而且有可能會(huì)因?yàn)楹竺娴妮敵鰧?dǎo)致轉(zhuǎn)向失敗。
<%@ include file="/page/checkLogin.jsp" %>這個(gè)放在要驗(yàn)證的頁(yè)面的第一句。
checkLogin.jsp 內(nèi)容是通過(guò)看session 里面有沒登陸用戶的內(nèi)容來(lái)判斷是否登錄, 如果沒有,那么跳轉(zhuǎn)到登陸頁(yè)面:
復(fù)制代碼 代碼如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
if (session.getAttribute("userinfo") == null) {
response.sendRedirect(url);
return;
}
%>
相關(guān)文章
jsp中頁(yè)面間傳漢字參數(shù)轉(zhuǎn)碼的方法
這篇文章主要介紹了jsp中頁(yè)面間傳漢字參數(shù)轉(zhuǎn)碼的方法,有需要的朋友可以參考一下2014-01-01
JSP實(shí)現(xiàn)簡(jiǎn)單的用戶登錄并顯示出用戶信息的方法
這篇文章主要介紹了JSP實(shí)現(xiàn)簡(jiǎn)單的用戶登錄并顯示出用戶信息的方法,通過(guò)簡(jiǎn)單的登陸及登陸顯示頁(yè)面實(shí)現(xiàn)這一功能,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02
處理jsp顯示文字過(guò)長(zhǎng)問(wèn)題的解決方法
處理jsp顯示文字過(guò)長(zhǎng)問(wèn)題的解決方法,需要的朋友可以參考一下2013-03-03
struts2中一個(gè)表單中提交多個(gè)請(qǐng)求的例子(多個(gè)提交按鈕)
在很多Web應(yīng)用中,為了完成不同的工作,一個(gè)HTML form標(biāo)簽中可能有兩個(gè)或多個(gè)submit按鈕,Struts2中提供了另外一種方法,使得無(wú)需要配置可以在同一個(gè)action類中執(zhí)行不同的方法(默認(rèn)執(zhí)行的是execute方法)2014-04-04
Jsp+Servlet實(shí)現(xiàn)文件上傳下載 文件上傳(一)
這篇文章主要為大家詳細(xì)介紹了Jsp+Servlet實(shí)現(xiàn)文件上傳下載中的第一部分文件上傳,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01
JSP中動(dòng)態(tài)include與靜態(tài)include的區(qū)別介紹
動(dòng)態(tài)include與靜態(tài)include的區(qū)別你知道嗎,下面就詳細(xì)為大家詳細(xì)介紹下,如果你還不知道那么不要錯(cuò)過(guò)2013-11-11
jsp實(shí)現(xiàn)頁(yè)面實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間的方法
在頁(yè)面上實(shí)時(shí)顯示當(dāng)前系統(tǒng)時(shí)間,通過(guò)jsp簡(jiǎn)單實(shí)現(xiàn),具體如下,感興趣的朋友可以參考下2013-08-08

