http1.0协议中只有302码,没有303状态码;
http1.1,在默认情况下,很多服务端基础程序,为了兼容http1.0,在遇到本应响应303时,也给客户端响应了302。
碰到的问题:
但是在chrome浏览器下,iframe的http请求就被拦截掉了,提示在安全的https环境下不允许使用http访问,造成页面就死在了重定向之前的页面,不能正确的重定向到目标页面去了。
问题看起来很纳闷,但是严格安全限制的浏览器下,问题也很明显。在当时的情况下,也只是看到了现象,至于原因和原理一点都不明白。于是根据现象找解决办 法,我们用的spring mvc,在stackoverflow上面找到了类似的问题。通过设置viewResolver的redirectHttp10Compatible属性 为false,关闭了对http1.0协议的兼容支持,程序的redirect响应码则变为了303,之后的重定向请求则维持了一致的https协议。
- 302=<"HTTP/1.1 302Found(or Moved Temporarily)",
- 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>