http協議中302和303的區別


 

http1.0協議中只有302碼,沒有303狀態碼;
http1.1,在默認情況下,很多服務端基礎程序,為了兼容http1.0,在遇到本應響應303時,也給客戶端響應了302。


碰到的問題:

場景: 在整個web系統使用https的情況下,在程序中使用了redirect,結果發現redirect之后的重定向請求變成了http,此時redirect的響應碼為302.
 
問 題:由於整個應用嵌入的需求,在頁面組合上使用了iframe,整個網站包括父頁面和iframe的子應用的所有請求均使用的https協議,而在 iframe子應用的redirect請求之后出現了http請求,在ie和firefox等瀏覽器中,並沒有問題,(因為它們把iframe子應用中的 http請求也照樣上送到了服務器,接收到http請求時,服務端會強制客戶端使用https重定向請求),此時,對我們的系統仍然不存在影響(只是多了 一次重定向請求,但是對用戶看不到);

但是在chrome瀏覽器下,iframe的http請求就被攔截掉了,提示在安全的https環境下不允許使用http訪問,造成頁面就死在了重定向之前的頁面,不能正確的重定向到目標頁面去了。
   
       問題看起來很納悶,但是嚴格安全限制的瀏覽器下,問題也很明顯。在當時的情況下,也只是看到了現象,至於原因和原理一點都不明白。於是根據現象找解決辦 法,我們用的spring mvc,在stackoverflow上面找到了類似的問題。通過設置viewResolver的redirectHttp10Compatible屬性 為false,關閉了對http1.0協議的兼容支持,程序的redirect響應碼則變為了303,之后的重定向請求則維持了一致的https協議。

     所以,最終發現一個現象,在302和303的狀態碼下,整個https結構的web系統下,瀏覽器接收到此兩種不同的響應碼時,分別使用了http和https去重定向請求。查找網上的理解,
  1. 302=<"HTTP/1.1 302Found(or Moved Temporarily)",
  2. 303=<"HTTP/1.1 303See Other",

也看不出區別。所以,我的理解:302 響應碼是http1.0的標准,在當時還沒有支持https的相應協議出現,所以現在的瀏覽器為了兼容http1.0,在302狀態碼下,碰到了 https的重定向請求,也會以http去轉發;而303是http1.1的標准,瀏覽器就維持了一致的https的重定向請求了。

 

針對的在springmvc中的問題描述:

        項目部署在websphere中,整站在https下運行,當通過spring redirect 內部跳轉時,鏈接地址有https開頭轉變為http開頭,在這樣情況下導致項目請求無法訪問。

 1 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 2     <!-- redirectHttp10Compatible:解決https環境下使用redirect重定向地址變為http的協議,無法訪問服務的問題  
 3                    設置為false,即關閉了對http1.0協議的兼容支持  -->  
 4         <property name="redirectHttp10Compatible" value="false"/>
 5         <!-- view是用什么顯示,這里是jsp,還可以用velocity之類的 --> 
 6         <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" />
 7         <property name="contentType" value="text/html;charset=UTF-8" />
 8         <property name="prefix" value="/WEB-INF/view/" />
 9         <property name="suffix" value=".jsp" />
10     </bean>

原文地址:http://ayis.iteye.com/blog/2177023


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM