• http status 301/302 & java重定向/转发


    一、301/302
    1、什么是301转向?什么是301重定向?

      301转向(或叫301重定向,301跳转)是当用户或搜索引擎向网站服务器发出浏览请求时,服务器返回的HTTP数据流中头信息(header)中的状态码的一种,表示本网页永久性转移到另一个地址。

      2、什么是302重定向?

      302重定向又称之为302代表暂时性转移(Temporarily Moved ),英文名称:302 redirect。 也被认为是暂时重定向(temporary redirect),一条对网站浏览器的指令来显示浏览器被要求显示的不同的URL,当一个网页经历过短期的URL的变化时使用。一个暂时重定向是一种服 务器端的重定向,能够被搜索引擎蜘蛛正确地处理。

      3、301重定向与302重定向的区别

      302重定向是暂时的重定向,搜索引擎会抓取新的内容而保留旧的网址。因为服务器返回302代码,搜索引擎认为新的网址只是暂时的。

      301重定向是永久的重定向,搜索引擎在抓取新内容的同时也将旧的网址替换为重定向之后的网址。

      4、为什么302 重定向和网址劫持有关联

      从网址A 做一个302 重定向到网址B 时,主机服务器的隐含意思是网址A 随时有可能改主意,重新显示本身的内容或转向其他的地方。大部分的搜索引擎在大部分情况下,当收到302 重定向时,一般只要去抓取目标网址就可以了,也就是说网址B。如果搜索引擎在遇到302 转向时,百分之百的都抓取目标网址B 的话,就不用担心网址URL 劫持了。问题就在于,有的时候搜索引擎,尤其是Google,并不能总是抓取目标网址。

      比如说,有的时候A 网址很短,但是它做了一个302 重定向到B 网址,而B 网址是一个很长的乱七八糟的URL 网址,甚至还有可能包含一些问号之类的参数。很自然的,A 网址更加用户友好,而B 网址既难看,又不用户友好。这时Google 很有可能会仍然显示网址A。由于搜索引擎排名算法只是程序而不是人,在遇到302 重定向的时候,并不能像人一样的去准确判定哪一个网址更适当,这就造成了网址URL 劫持的可能性。也就是说,一个不道德的人在他自己的网址A 做一个302 重定向到你的网址B,出于某种原因, Google 搜索结果所显示的仍然是网址A,但是所用的网页内容却是你的网址B 上的内容,这种情况就叫做网址URL 劫持。你辛辛苦苦所写的内容就这样被别人偷走了。

      302 重定向所造成的网址URL 劫持现象,已经存在一段时间了。不过到目前为止,似乎也没有什么更好的解决方法。在正在进行的数据中心转换中,302 重定向问题也是要被解决的目标之一。从一些搜索结果来看,网址劫持现象有所改善,但是并没有完全解决。




    二、重定向/转发
    1、什么是重定向?
            服务器向浏览器发送一个302状态码及一个Location消息头(该消息头的值是一个地址)。浏览器在收到之后,会立即向这个地址发送请求。
    如果是按照通俗一点的按照流程里说就是这样:发送请求 -->服务器处理请求-->响应请求,返回给浏览器一个新的地址与响应码(302状态 码)-->浏览器根据响应码(302状态码),判定该响应为重定向,自动发送一个新的请求给服务器,请求地址为之前返回的地址-->服务器运 行-->响应请求给浏览器
    在编程的时候怎么写:
            response.sendRedirect(String url);很简单的一句代码就行了。但是有两个问题是要注意的:
    ①重定向之前,不能够有任何的输出,否则会发生错误。
    ②重定向之前,会先清空response中缓存的数据。
    特点是:
    ①重定向的地址是任意的。
    ②重定向之后,浏览器地址栏的地址会变成Location所指定的地址。
    2、什么是转发?
            一个web组件(servlet/jsp) 将未完成的处理交给另外一个web组件继续完成。
            一般应用的场合:一个servlet处理请求之后,将处理结果交给一个jsp,让jsp依据处理结果生成相应的界面。
    如果是按照通俗一点的按照流程里说就是这样:发送请求 -->服务器处理请求-->进行请求的重新设置,例如通过 request.setAttribute(name,value)-->根据转发的地址,获取该地址的jsp网页-->响应请求给浏览器。
    编程的时候怎么写?这个比重定向要复杂一点:
    ① 将处理结果绑订定到request对象上。
    request.setAttribute(String name,Object obj);
    //如果name对应的值不存在,则返回null。
    Object request.getAttribute(String name);
    request.removeAttribute(String name);
    ② 获得转发器
    //uri:是要转发的目的地,目的地只能是同一个应用的内部。
    RequestDispatcher rd = request.getRequestDispatcher(String uri);
    ③ 转发
    rd.forward(request,response);
    需要注意的是:
    转发之前,不要有任何的刷新操作,否则会出错。
    转发之前,如果response当中缓存有数据,会先清空。
    转发的特点
    ① 转发的目的地只能是同一个应用内部的各个组件之间。
    ② 转发之后,浏览器地址栏的地址不会变。
    综合上面解说:总结下重定向和转发的区别:
    区别①:
    重定向时,浏览器上的网址改变
    转发时,浏览器上的网址不变
    区别②:
    重定向实际上产生了两次请求
    转发只有一次请求
    区别③:
    重定向的时候网址可以是任何的网址
    转发的网址只能是本站点的网址
    根据上面的分析,所以说,用重定向和转发不是一个习惯不习惯的问题,而是在什么情况下必须用的问题。

  • 相关阅读:
    centos7安装es6.4.0
    将mysql数据同步到ES6.4(全量+增量)
    c#基于supersocket的简单websocket服务端收发消息实现
    c#log4net简单好用的配置
    MongoDB安装配置教程
    IntelliJ IDEA 中创建maven项目
    VMware Workstation 的安装和使用
    Redis使用场景
    Redis 下载安装
    MySQL--启动和关闭MySQL服务
  • 原文地址:https://www.cnblogs.com/qianxinxu/p/6223379.html
Copyright © 2020-2023  润新知