JSP/Servlet开发——第二章 JSP数据交互(一)

一、 JSP内置对象:JSP内置对象是 Web 容器建立的一组对象;css

   ●JSP经常使用的内置对象:out、request、application、session、response等;html

  ●内置对象不须要实例化的缘由:java

       ★由Web容器加载的一组Servlet API的实例,这些实例由 JSP 规范进行了默认的初始化操做,能够直接在JSP中使用,特别要注意的是JSP内置对象名称均是JSP的保留字,不得看成自定义变名使用;web

二、JSP的内置对象out:数据库

●out对象是JspWriter类的实例;数组

●out 内置对象是在 JSP 开发过程当中使用最为频繁的对象,out 对用于向浏览器输出数据,其经常使用的方法是 print( ) , 该方法用于在页面中显示字符串信息。浏览器

eg:在页面上显示 “Hello JSP':缓存

         <%安全

             out.print(“Hello JSP”);服务器

         %>

●out经常使用的方法:

方法名称

说明

void print(Object c)

向客户端打印数据(将各类类型的数据转换成字符串)

void println(Object c)

向客户端打印数据(将各类类型的数据转换成字符串)并换行(在html源代码里表现为回车,但在页面渲染为空格)

void write(charset)

向客户端打印数据(只能打印:字符、字符数组、字符串)

 

三、 JSP 内置对象 request:

  request对象是最经常使用的 JSP 内置对象之一 , 其中包含了有关浏览器请求的信息;

    工做原理:

           

       ●request对象经常使用方法:

方法名称

 说明

String getParameter(String name)

根据页面表单组件名称获取页面提交数据

String[ ] getParameterValues(String name)

获取一组相同名称名命的表单组件提交的数据(表单组件对应多个值时的请求数据 )

void setCharacterEncoding(String charset)

指定每一个请求的编码

RequestDispatcher getRequestDispatcher(String path)

返回一个javax.servlet.RequestDispatcher对象,该对象的forward( )方法用于转发请求

 

 

eg:编码实现学员的注册功能:

注册reginput . jsp页面的jsp:

<body>

         <div align="center">请输入注册信息

                  <form name="form1" method="post" action="reginfo.jsp">

              <table  border="0" align="center">

                                <tr>

                            <td>用户名:</td>

                            <td><input type="text" name="name"></td>

                              </tr>

                                   <tr>

                                  <td height="19">密码:</td>

                                  <td height="19"><input type="password" name="pwd"></td>

                                   </tr>

                                   <tr>

                            <td>信息来源:</td>

                            <td>

                                           <input type="checkbox" name="channel" value="报刊">报刊

                                           <input type="checkbox" name="channel" value="网络">网络<br/>

                                           <input type="checkbox" name="channel" value="朋友推荐">朋友推荐

                                           <input type="checkbox" name="channel" value="电视">电视

                                      </td>

                              </tr>

                              <!-- 如下是提交、取消按钮 -->

                              <tr >

                            <td colspan="2" align="center" >

                                            <input type="submit" name="Submit" value="提交">

                                            <input type="reset" name="Reset" value="取消">

                            </td>

                              </tr>

              </table>

                </form>

         </div>

      </body>

 

eg:提交reginfo . isp页面的jsp:

<body>

       <%

           request.setCharacterEncoding("UTF-8");

           String name = request.getParameter("name");

           String pwd = request.getParameter("pwd");

           String[] channels = request.getParameterValues("channel");

       %>

       <div align="center">你输入的注册信息

              <table border="0" align="center">

                  <tr>

                      <td width="80" height="20">用户名:</td>

                      <td><%=name%></td>

                  </tr>

                  <tr>

                      <td height="20">密码:</td>

                      <td><%=pwd%></td>

                  </tr>

                  <tr>

                      <td height="20">信息来源:</td>

                      <td >

                      <%

                          if (channels != null) {

                              for (String channel: channels) {

                                  out.print(channel+"&nbsp;");

                              }

                          }

                      %>

                      </td>

                  </tr>

              </table>

       </div>

       </body>

代码分析:

request的getParameter()方法是最为经常使用的,使用此方法能够得到请求中所提交的参数值,

  例如,注册页面 (reginput . jsp) 经过 HTML 表单为注册提交页面 (reginfo . isp) 提交了两个参数,名称分别为name 和 pwd,经过调用 request .getParameter( "name' ) 和 request.getParameter 就能够获取这两个参数的值;

★在注册页面中,出现了多个复选框 复选框的名称都是 channel, 在注册提交页面中使用getParameterValues(“channel”) 方法就能够获取一个字符串数组,该数组中存储的是全部选中的复选框对应的值。若是没有选择任何选项,请求中不包含名为channel的参数. 则该方法返回null;

★request 对象的 setCharacterEncodlrig ( ) 方法用于设置字符集,能够用来解决中文乱码问题,经常使用字符集编码有 ASCll 、ISO-8859-1 、GB23十二、GBK、Unicode、UTF-8等,java在其内部使用 Unicode字符集来表示字符,这样就存在 Unicode 字符集和本地字符集进行换的过程,左Web 应用中, 一般都包括了浏览器、Web 服务器、Web 应用程序和数据库等部分,每一部分都有可能使用不一样的字符集,从而致使字符数据在各类不一样的字符集之间转换时,出现乱码的问题;

      ●乱码可能的缘由:

         1、JSP页面自己的编码:

                pageEncoding:页面自己的编码;

                浏览器渲染页面时采用的编码格式;

          ★一旦制定了一种编码格式,另外一种编码格式若是不进行指定的话,默认都采用已经指定的编码格式;

        2、浏览器渲染页面采用的编码

        三、服务器保存数据采用的编码(request)

对于中文乱码问题,根据产生的缘由,主要有如下几种解决方案:

▲以POST 方法提交的表单数据中有中文字符时:

  ◆Tomcat对请求数据默认采用ISO-8859-1字符集进行解码,request 对象的 getParameter方法获得的字符串是以 ISO-8859-1 转换而来的,因此在获取请求参数值以前,调用setCharacterEncoding ( "UTF-8“ )方法,将请求的解码方式设定为 UTF-8。注意:页面和浏览器发请求也应一导致用 UTF-8 编码, 经过 JSP 页面设置 page 指令的 contentType属性,指定页面内容的编码格式以下:

     <% page contentType=”text/html;charset=UTF-8”%>

      ☆注:cententType和pageEncoding的区别:cententType定义响应的资源类型,也能够包含JSP页面和响应内容的字符集;pageEncoding 指定JSP文件的字符集及默认的 contentType字符集;

以 GET方法提交的表单数据中有中文字符时:

  ◆当采用GET方式提交表单时,提交的数据做为查询字符串被附加到URL的末端发送到服务器,对于这部分数据,在服务器调用setCharacterEnCoding ( ) 方法是不起做用的,咱们须要获得请求参数值后,进行编码转换,在上面的示例中,将表单的提交方式改成 method= 'get',则在注册提交页reginfo中将得到用户名的代码修改:

        String name = request.getParameter("name");

    name=new String(name.getBytes(“ISO-8859-1”),”UTF-8”)

      ☆其中,nama.getBytes(“ISO-8859-1”)是按照 “ISO-8859-1”字符集编码把 name 字符串转换为btye数组,再经过new String()方法,使用指定的”UTF-8”字符集把 byte 数组构造为一个新的String;

在 Tomcat 中设置字符集:

  ◆当表单采用 GET 方法提交时,虽然能够经过构造一个新的String 的方式解决中文乱码问题,可是当获取多个参数值时.每一个参数都进行从新编码,操做比较烦琐,效率也不高。这时能够经过Tomcat中设置字符集的方式解决,配置方式以下:找到 Tomcat 目录结构\conf\server . xml 文件,<Connector>元素中添加 URIEncoding 属性,将它的值设置为 “UTF-8 “;

      <Connector port="8080" protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443" URIEncoding =“UTF-8”/>

        在 Tomcat 中设置了字符集编码,对于浏览器以 GET 方式提交的数据则无须在 JSP页面中再进行从新编码处理 (注意浏览器需以 UTF-8,编码发送 URL);

 

四、JSP内置对象response:

  与request对象相对应的是response对象,response对象用于响应客户请求并向客户端输出信息;

  ●工做原理:

           

  ●response对象经常使用的方法:

addCookie(Cookie cookie)

向客户端添加Cookie;

setContentType(String type)

设置HTTP响应的contentType类型

setCharacterEncoding(String charset)

设置响应所采用字符编码类型

sendRedirect(String location)

将请求从新定位到一个新的URL上

          最经常使用的方法:sendRedirect(String location):客户端将从新发送请求到指定的URL;

5、转发与重定向:

转发:从程序运行的角度理解. 即当客户端发送一个请求到服务器后, Web 服务器在容器内部完成求跳转, 而后将最终的结果发送给浏览器,整个过程都是在容器内部完成的,而对应到客户端,不管服务器内部如何处理,做为浏览器都只是提交了一个请求,于是客户端的 URL 地址不会发生改变;

转发的实现很简单,使用 request 的 getRequestDispatcher ( ) 方法获得 RequestDispatcher 对象,此对象用于封装一个由路径所标识的服务器资源,而后用这个对象调用 forward )方法,将请求传递服务器上另外的 JSP 页面或者 HTML 文件;

转发能够在多个页面交互过程当中实现请求数据的共享;

重定向:当用户登陆成功后. 使用的是 response 对象的 sendRedirect ( ) 方法。 那么该方法行的结果是客户端从新向服务器请求一个地址连接,因为是发送新的请求 , 于是上次请求中的数将随之丢失 这种行为称为重定向。因为服务器从新定向了URL, 于是在客户端浏览器中显示的新的 URL 地址, 因此重定向能够理解为浏览器至少提交了两次请求

●转发和重定向有什么区别:转发和重定向都可以实现页面的跳转,不一样之处表如今如下几方面:

  ◆转发过程:Web 服务器内部将一个 request 请求的处理权交给另一个资源,属于同一个访问请求和响应过程,因此 request对象的信息不会丢失,

    ★转发是在服务器端发挥做用,经过 RequestDispatcher 对象的forward( ) 方法将交信息在多个页面间进行传递;

    ★转发是在服务器内部控制权的转移 , 客户端浏览器的地址栏不会显示出转向的地址。

  ◆重定向过程:Web 服务器向浏览器返回一个响应,浏览器接受此响应后再发一个新的 http请求到服务器,这属于两次不一样的请求, 则上一次请求的 request信息将丢失;

    ★重定向是在客户端发挥做用,经过请求新的地址实现页面转向。其经过浏览器从新请求地址,在地址栏中能够显示转向后的地址。

若是须要在重定向的状况下将简单数据(值类型、字符串)传递到目标页面;也以使用查询字符串(Query String)实现:

  response.sendRedirect(“welcome.jsp?username=”+name”);

  查询字符串以名值对方式 存储数据,经过“?”链接在URL的后面,多个名值对可使用“&”进行分隔;

查询字符串的应用:

eg:选择页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>

        <title>选择喜欢的颜色</title>

    </head>

    <body>

         请从如下7种颜色中,选择你最喜欢的颜色<br/>

        <a href="color.jsp?color=赤色">赤色</a>&nbsp;&nbsp;

        <a href="color.jsp?color=橙色">橙色</a>&nbsp;&nbsp;

        <a href="color.jsp?color=黄色">黄色</a>&nbsp;&nbsp;

        <a href="color.jsp?color=绿色">绿色</a>&nbsp;&nbsp;

        <a href="color.jsp?color=青色">青色</a>&nbsp;&nbsp;

        <a href="color.jsp?color=蓝色">蓝色</a>&nbsp;&nbsp;

        <a href="color.jsp?color=紫色">紫色</a>

    </body>

</html>

 

eg:展现页面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

    <head>

        <title>我喜欢的颜色</title>

    </head>

    <body>

    <%  

             //已在Tomcat中设置字符集为“UTF-8String color = request.getParameter("color");

    %>

        你最喜欢的颜色是:<%=color%>

    </body>

</html>

分析:经过上面的代码, 能够发现数据传递成功了:代码中的a标签部分,在跳转页面的后面都有一个 '?'. 以及一个参数名 'color',每个参数的值就是所选择的颜色。而在结果页面中使用 request 对象的 getParameter ) 方法 , 就可取到参数 'color" 的值,达到了数据的传递效果;

注:使用超连接进行数据传递时: 采用的是 GET 方式提交请求,若是在传递裁据中存中 文,使用 request 对象直接获取时,容易产生乱码

问題。所以,须要对数据进行从新编码。

  ▲可使用 String 对象的方法实现数椐从新编码;

    ★语法 :new String ( 须要编码的数据.getBytes(“ ISO-8859-1“ ),“ UTF-8“ );

  ▲也能够经过设置 Tomcat 字符集实现:

    ★当传递多个数据时, 可用 “&” 链接。

      eg:<a href=“ color.jsp?color=赤色&id=1>赤色</a>, 在荻取数据时, 依然能够经过参数名 “id” 读取参数值 “1”;

 

六、JSP 内置对象 session:

  会话:

session:原义是指善始善终的一系列动做;

  eg:打电话时,甲方拿起电话拨通乙方电话这一系列的过程就能够称为一个会话,电话挂断时会话结束;

对Web开发来讲,一个会话就是在一段时间内一个用户与 Web 服务器的一连串相关的交互过程,它可包含浏览器与服务器之间的屡次请求,响应过程:在一次会话中,用户可能会屡次请求访问一网页,也有可能请求访问同一个服务器的其余资源;

下图描述了浏览器与服务器的一个会话过程:

   

会话机制是一种服务器端的机制,当用户向服务器发出第一次请求时,服务器会为该用户建立惟一的会话,会话将一直延续到用户访问结束;

当服务器接收到客户端的请求时,服务器首先会判断是否已经建立了与该客户端对应的会话,若是已经建立就将该请求与此会话相关联,若是没有包建,则会建立一个新会话,此客户端以后发送的请求将关联到该会话;

而服务器判断是否建立了相关会话,是经过一个惟一的标识 sessionid来实现的。若是在客户端请求中包含了一个sessionid,则说明在此前已经为客户端建立了会话,服务器就会根据这个 sessionid将对应的会话对象读取出来;不然就会建立一个新的会话对象并生成一个 sessionid,并将 sessionid在本次晌应的过程返回客户端保存;

sessionid会返回客户端,那么在客户端 sessionid 会保存在什么位置?

  回答:在客户端保存用户信息使用的是 cookie, 所以保存 sessionid 的方式也是使cookoe来实现的,在客户端的 cookie 中,保存 sessionid 的名称是 JSESSIONID, segsionid 的值是由一串复杂字符串组成的;

    eg:JSESSIONID=2A 11D30C7B32329D7C8BF16DC598C509 , 其中等号后面的字符串就是分配的 scssionid 对应的值;

七、 session对象:

  session 对象做为JSP提供的内置对象之一 , session 对象容许用户访问会话的相关信息,以及绑定数据到话(在服务器端使用相似于哈希表的结构来保存信息)。绑定到会话的数据能够在屡次请求之间持续有效;

    ◆ session对象的经常使用方法:

方法名称

说明

String getId()

获取sessionid

void setMaxInactiveInterval(int interval)

设定session的非活动时间

int getMaxInactiveInterval()

获取session的有效非活动时间(以秒为单位)

void invalidate()

设置session对象失效

void setAttribute(String key, Object value)

以key/value的形式将对象保存对到session

Object getAttribute(String key)

经过key获取session中保存的对象值

void removeAttribute(String key)

从session中删除指定名称(key)所对应的对象

     ●session与窗口的关系:

        ◆每一个session对象都与一个浏览器窗口对应 ,从新开启一个浏览器窗口,能够从新建立一个session对象(不一样版本浏览器可能有所差异)

        ◆经过超连接打开的新窗口,新窗口的session与其父窗口的session相同

八、使用 session 对象实现权限控制:

    eg:用户经过登陆页面登网站, 若是该用户是已注册用户 . 系统会保存该用户的登陆信息. 并让用户进入其欲访问的页面;

       用户直接访问网站的某个页面. 系统会查询是否保存有该用户的登陆信息,若是有则显示该页面的内容;若是没有,则转入登陆页面. 要求用户登陆网站

  这里要实现的权限访问控制是基于 session 对象来完成的。

    eg使用 session 为新闻发布系增长访问控制,要求新闻发布系统中全部针对新闻的操做,如发布新闻、 修改新闻 、发布新闻标题、 修改新闻标题,都只能由管理员才能完成。普通用户没有权限进行访问,访问控制流程如图:

                

    ★根据新闻发布系统的访问控制流程,实现访问控制的流程以下:

1、在登录页面输入用户名和密码;

2、在登录处理页面进行登录验证;

3、在会话中,保存用户信息,若是用户登陆成功,则跳转到管理员页面;

4、在管理员页面读取会话中的用户信息,并进行校验;

5、验证失败,返回登录页面;

eg:登录处理页面jsp的代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

<title>登陆处理页面</title>

</head>

<body>

    <%

        request.setCharacterEncoding("UTF-8");

        //获取请求数据,并去除空格

        String name = request.getParameter("userName").trim();

        String pwd = request.getParameter("pwd").trim();

        boolean valid = false;  //判断用户验证是否成功

        if("admin".equals(name)&&"admin".equals(pwd)){

             valid = true;

             //设置用户登陆信息

             session.setAttribute("login", name);

             //设置session过时时间

             session.setMaxInactiveInterval(10*60);

        }

        if (valid) {

            request.getRequestDispatcher("admin.jsp")

                .forward(request,response);

        } else {

                response.sendRedirect("index.jsp");

        }

    %>

    </body>

</html>

分析:接下来在管理员操做页面加入登陆验证。此时要完成的任务是,从 session 中提取用户的信息,若是用户信息存在,则能够进行操做; 若是用户信息不存在 . 则跳转到登陆页面。这一步实现了问的控制;

 

 

eg:在管理员界面加入以下代码:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

  <head>  

    <title>管理员</title>

  </head>

 

  <body>

    <%

           String login = (String) session.getAttribute("login");

           if (login == null){

               response.sendRedirect("index.jsp");

               return;

           }

    %>

    您好,欢迎您!

  </body>

</html>

分析:在登陆处理页面中,已经实现了对用户的身份验证,为何在此处还要再进验证。缘由很简单.,若是用户不经过登陆方式,而是直接在浏览器地址栏中输入管理员页面的地址这样将会直接绕过登陆限制而访问成功。 因此须要在管理员操做界面再添加控制语句,以免此状况的发生。

◆至此:此示例的访问控制已经基本实现了;

  ▲验证访问控制效果的具体步骤以下:

    1、直接在浏览器地址栏中输入URL,访问管理员操做页面;

    2、经过登陆页面进入管理员操做页面;

    3、从新开启一个浏览器窗口,直接访问管理员操做页面;

◆按照以上步骤运行,观察每一个步骤会发生什么样的结果 , 并思考为何会产生这样的结果。下面对此进行分析:

  ☉如釆直接在浏览器地址栏中输入管理员操做页面的 URL, 系统会跳入登陆页面 , 提示用户进行登陆。 这个缘由很简单,由于咱们在管理员操做页面中加入了访问控制,只有正确登录后,进入管理员操做界面,会话中才会存储用户登陆成功的状态信息,才能够正常访问管理员操做页面;

  ☉若是从新开启一个浏览器窗口,直接访问管理员操做页面,无论在其余窗口中是否登录,所进入的确定是登陆页面,这是咱们常常遇到的问题,即 session 与浏器窗口的关系 ;

  ☉每一个 session 对象都与浏览器一一对应,也就是说,从新开启一个浏览器窗口,至关于新建立一个 scssion 对象。可是须要注意的是,因为浏览器或版本不一样,即便从新开启个浏览器窗口,也会认为是同一个 session 对象,也就是所谓的出现会话共享问题;

    ☆以 IE8为例,能够在浏览器上执行 "文件” — "新建会话’ 命令新建一个会话窗口。

    ☆另外,提供两种取消浏览器窗口共享 session 的办法:

        1、修改 IE8 的快捷方式:右击 IE8快捷方式图标,在弹出 的快捷菜单中选择 ’属性" —“ 目 标’ 选项, 末尾添加 “- nomerge",修改后如"C:\Program Files\Itemet Explorer\iexplorc.exe" -nomerge;

        2、使用命令参数 "iexpldre.exe -nomerge' 打开IE

  ☉如今就可解释为何在登陆成功后,从新开启一个浏览器窗口直接访问管理员操做页便可进入登陆页面了,在其余浏览器窗口中保存的登陆信息与新的浏览器窗口彻底无关,因此系统会断定还没有登陆,跳转进入登陆页面;

九、会话的失效:

会话也是有时效的,使会话失效的方式有两种: 一种是会话超时;另外一种是手动调用方法设置失效;

●会话超时是指两次请求的时间间隔超过了服务器容许的最大时间间隔;

 会话的超时间隔可经过三种方法设置:

  ◆经过 session 对象的setMaxInactiveInterval( )方法设置,单位是秒;

      <%

      session.setAttribute("login","admin");

      //参数 600 的单位是秒, 表示在 10 分钟后 session对象失效;

      session.setMaxInactiveInterval(600);

      response.sendRedirect("admin.jsp");

     %>

  ◆在项目的web.xml中设置,单位是分钟,设置为0或负数,表示永不超时;  

        <session-config>

            <session-timeout>10</session-timeout>

     </session-config>    

  ◆在应用服务器中设置,在 Tomcat目录下的/conf/web.xml文件中找到<sesston-config>元素, 其中<sesston-config>元素中的 30 就是默认的时间,单位是分钟,能够修改其值;

  ◆项目A:web.xml,Tomcat:web.xml;

        ★Tomcat:web.xml:全局配置,项目A:web.xml:针对项目的配置;若是有重复的选项,调用项目A的web.xml;

        ★项目调用的是:项目A:web.xml + Tomcat:web.xml;

        ★修改Tomcat:web.xml对全部的项目都有影响;

  ☉动调用方法设置失效是经过调用 session 对象的 invalidate()方法实现的, 主要应用于用户注销的场合,但若是只想清空会话中绑定的某个数据对象,则能够调用 session . removeAttribute (String key)方法,将指定的对象从会话中清除,而会话仍然有效;

十、 include指令:

  ●文件引用指令include,将一些能够重用的内客写入一个单独的文件,而后经过 include 指令引用该文件 , 从而缓解代码的冗余问題, 而且修改时也更方便;

  include 指令的基本语法:以<%@ 开始,以 %> 结束。

          语法:<%@  include file="应用文件路径 " %>

   Include 指令表示,在 JSP 编译时插入一个包含文本或代码的文件,这个包含的过程是静态的,包含的文件能够是 JSP 页面、HTML 网页、文本文件等。

  include 指令只有一个 fi1e 属性 , 表示被包含的文件路径;

 十一、状态码:

状态码

含义

100

客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者若是请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。

101

服务器已经理解了客户端的请求,并将经过Upgrade消息头通知客户端采用不一样的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade消息头中定义的那些协议。  只有在切换新的协议更有好处的时候才应该采起相似措施。例如,切换到新的HTTP版本比旧版本更有优点,或者切换到一个实时且同步的协议以传送利用此类特性的资源。

102

由WebDAV(RFC 2518)扩展的状态码,表明处理将被继续执行。

200

请求已成功,请求所但愿的响应头或数据体将随此响应返回。

201

请求已经被实现,并且有一个新的资源已经依据请求的须要而创建,且其URI已经随Location头信息返回。假如须要的资源没法及时创建的话,应当返回'202 Accepted'。

202

服务器已接受请求,但还没有处理。正如它可能被拒绝同样,最终该请求可能会也可能不会被执行。在异步操做的场合下,没有比发送这个状态码更方便的作法了。  返回202状态码的响应的目的是容许服务器接受其余过程的请求(例如某个天天只执行一次的基于批处理的操做),而没必要让客户端一直保持与服务器的链接直到批处理操做所有完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户可以估计操做是否已经完成。

203

服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的肯定集合,而是来自本地或者第三方的拷贝。当前的信息多是原始版本的子集或者超集。例如,包含资源的元数据可能致使原始服务器知道元信息的超级。使用此状态码不是必须的,并且只有在响应不使用此状态码便会返回200 OK的状况下才是合适的。

204

服务器成功处理了请求,但不须要返回任何实体内容,而且但愿返回更新了的元信息。响应可能经过实体头部的形式,返回新的或更新后的元信息。若是存在这些头部信息,则应当与所请求的变量相呼应。  若是客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即便按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。  因为204响应被禁止包含任何消息体,所以它始终以消息头后的第一个空行结尾。

205

服务器成功处理了请求,且没有返回任何内容。可是与204响应不一样,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,当即重置表单,以便用户可以轻松地开始另外一次输入。  与204响应同样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。

206

服务器已经成功处理了部分GET请求。相似于FlashGet或者迅雷这类的HTTP下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。  该请求必须包含Range头信息来指示客户端但愿获得的内容范围,而且可能包含If-Range来做为请求条件。  响应必须包含以下的头部域:  Content-Range用以指示本次响应中返回的内容的范围;若是是Content-Type为multipart/byteranges的多段下载,则每一multipart段中都应包含Content-Range域用以指示本段的内容范围。假如响应中包含Content-Length,那么它的数值必须匹配它返回的内容范围的真实字节数。  Date  ETag和/或Content-Location,假如一样的请求本应该返回200响应。  Expires,Cache-Control,和/或Vary,假如其值可能与以前相同变量的其余响应对应的值不一样的话。  假如本响应请求使用了If-Range强缓存验证,那么本次响应不该该包含其余实体头;假如本响应的请求使用了If-Range弱缓存验证,那么本次响应禁止包含其余实体头;这避免了缓存的实体内容和更新了的实体头信息之间的不一致。不然,本响应就应当包含全部本应该返回200响应中应当返回的全部实体头部域。  假如ETag或Last-Modified头部不能精确匹配的话,则客户端缓存应禁止将206响应返回的内容与以前任何缓存过的内容组合在一块儿。  任何不支持Range以及Content-Range头的缓存都禁止缓存206响应返回的内容。

207

由WebDAV(RFC 2518)扩展的状态码,表明以后的消息体将是一个XML消息,而且可能依照以前子请求数量的不一样,包含一系列独立的响应代码。

300

被请求的资源有一系列可供选择的回馈信息,每一个都有本身特定的地址和浏览器驱动的商议信息。用户或浏览器可以自行选择一个首选的地址进行重定向。  除非这是一个HEAD请求,不然该响应应当包括一个资源特性及地址的列表的实体,以便用户或浏览器从中选择最合适的重定向地址。这个实体的格式由Content-Type定义的格式所决定。浏览器可能根据响应的格式以及浏览器自身能力,自动做出最合适的选择。固然,RFC 2616规范并无规定这样的自动选择该如何进行。  若是服务器自己已经有了首选的回馈选择,那么在Location中应当指明这个回馈的URI;浏览器可能会将这个Location值做为自动重定向的地址。此外,除非额外指定,不然这个响应也是可缓存的。

301

被请求的资源已永久移动到新位置,而且未来任何对此资源的引用都应该使用本响应返回的若干个URI之一。若是可能,拥有连接编辑功能的客户端应当自动把请求的地址修改成从服务器反馈回来的地址。除非额外指定,不然这个响应也是可缓存的。  新的永久性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。  若是这不是一个GET或者HEAD请求,所以浏览器禁止自动进行重定向,除非获得用户的确认,由于请求的条件可能所以发生变化。  注意:对于某些使用HTTP/1.0协议的浏览器,当它们发送的POST请求获得了一个301响应的话,接下来的重定向请求将会变成GET方式。

302

请求的资源如今临时从不一样的URI响应请求。因为这样的重定向是临时的,客户端应当继续向原有地址发送之后的请求。只有在Cache-Control或Expires中进行了指定的状况下,这个响应才是可缓存的。  新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。  若是这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非获得用户的确认,由于请求的条件可能所以发生变化。  注意:虽然RFC 1945和RFC 2068规范不容许客户端在重定向时改变请求的方法,可是不少现存的浏览器将302响应视做为303响应,而且使用GET方式访问在Location中规定的URI,而无视原先请求的方法。状态码303和307被添加了进来,用以明确服务器期待客户端进行何种反应。

303

对应当前请求的响应能够在另外一个URI上被找到,并且客户端应当采用GET的方式访问那个资源。这个方法的存在主要是为了容许由脚本激活的POST请求输出重定向到一个新的资源。这个新的URI不是原始资源的替代引用。同时,303响应禁止被缓存。固然,第二个请求(重定向)可能被缓存。  新的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。  注意:许多HTTP/1.1版之前的浏览器不能正确理解303状态。若是须要考虑与这些浏览器之间的互动,302状态码应该能够胜任,由于大多数的浏览器处理302响应时的方式偏偏就是上述规范要求客户端处理303响应时应当作的。

304

若是客户端发送了一个带条件的GET请求且该请求已被容许,而文档的内容(自上次访问以来或者根据请求的条件)并无改变,则服务器应当返回这个状态码。304响应禁止包含消息体,所以始终以消息头后的第一个空行结尾。  该响应必须包含如下的头信息:  Date,除非这个服务器没有时钟。假如没有时钟的服务器也遵照这些规则,那么代理服务器以及客户端能够自行将Date字段添加到接收到的响应头中去(正如RFC 2068中规定的同样),缓存机制将会正常工做。  ETag和/或Content-Location,假如一样的请求本应返回200响应。  Expires,Cache-Control,和/或Vary,假如其值可能与以前相同变量的其余响应对应的值不一样的话。  假如本响应请求使用了强缓存验证,那么本次响应不该该包含其余实体头;不然(例如,某个带条件的GET请求使用了弱缓存验证),本次响应禁止包含其余实体头;这避免了缓存了的实体内容和更新了的实体头信息之间的不一致。  假如某个304响应指明了当前某个实体没有缓存,那么缓存系统必须忽视这个响应,而且重复发送不包含限制条件的请求。  假如接收到一个要求更新某个缓存条目的304响应,那么缓存系统必须更新整个条目以反映全部在响应中被更新的字段的值。

305

被请求的资源必须经过指定的代理才能被访问。Location域中将给出指定的代理所在的URI信息,接收者须要重复发送一个单独的请求,经过这个代理才能访问相应资源。只有原始服务器才能创建305响应。  注意:RFC 2068中没有明确305响应是为了重定向一个单独的请求,并且只能被原始服务器创建。忽视这些限制可能致使严重的安全后果。

306

在最新版的规范中,306状态码已经再也不被使用。

307

请求的资源如今临时从不一样的URI响应请求。因为这样的重定向是临时的,客户端应当继续向原有地址发送之后的请求。只有在Cache-Control或Expires中进行了指定的状况下,这个响应才是可缓存的。  新的临时性的URI应当在响应的Location域中返回。除非这是一个HEAD请求,不然响应的实体中应当包含指向新的URI的超连接及简短说明。由于部分浏览器不能识别307响应,所以须要添加上述必要信息以便用户可以理解并向新的URI发出访问请求。  若是这不是一个GET或者HEAD请求,那么浏览器禁止自动进行重定向,除非获得用户的确认,由于请求的条件可能所以发生变化。

400

一、语义有误,当前请求没法被服务器理解。除非进行修改,不然客户端不该该重复提交这个请求。  二、请求参数有误。

401

当前请求须要用户验证。该响应必须包含一个适用于被请求资源的WWW-Authenticate信息头用以询问用户信息。客户端能够重复提交一个包含恰当的Authorization头信息的请求。若是当前请求已经包含了Authorization证书,那么401响应表明着服务器验证已经拒绝了那些证书。若是401响应包含了与前一个响应相同的身份验证询问,且浏览器已经至少尝试了一次验证,那么浏览器应当向用户展现响应中包含的实体信息,由于这个实体信息中可能包含了相关诊断信息。参见RFC 2617。

402

该状态码是为了未来可能的需求而预留的。

403

服务器已经理解请求,可是拒绝执行它。与401响应不一样的是,身份验证并不能提供任何帮助,并且这个请求也不该该被重复提交。若是这不是一个HEAD请求,并且服务器但愿可以讲清楚为什么请求不能被执行,那么就应该在实体内描述拒绝的缘由。固然服务器也能够返回一个404响应,假如它不但愿让客户端得到任何信息。

404

请求失败,请求所但愿获得的资源未被在服务器上发现。没有信息可以告诉用户这个情况究竟是暂时的仍是永久的。假如服务器知道状况的话,应当使用410状态码来告知旧资源由于某些内部的配置机制问题,已经永久的不可用,并且没有任何能够跳转的地址。404这个状态码被普遍应用于当服务器不想揭示到底为什么请求被拒绝或者没有其余适合的响应可用的状况下。

405

请求行中指定的请求方法不能被用于请求相应的资源。该响应必须返回一个Allow头信息用以表示出当前资源可以接受的请求方法的列表。  鉴于PUT,DELETE方法会对服务器上的资源进行写操做,于是绝大部分的网页服务器都不支持或者在默认配置下不容许上述请求方法,对于此类请求均会返回405错误。

406

请求的资源的内容特性没法知足请求头中的条件,于是没法生成响应实体。  除非这是一个HEAD请求,不然该响应就应当返回一个包含可让用户或者浏览器从中选择最合适的实体特性以及地址列表的实体。实体的格式由Content-Type头中定义的媒体类型决定。浏览器能够根据格式及自身能力自行做出最佳选择。可是,规范中并无定义任何做出此类自动选择的标准。

407

 与401响应相似,只不过客户端必须在代理服务器上进行身份验证。代理服务器必须返回一个Proxy-Authenticate用以进行身份询问。客户端能够返回一个Proxy-Authorization信息头用以验证。参见RFC 2617。

408

请求超时。客户端没有在服务器预备等待的时间内完成一个请求的发送。客户端能够随时再次提交这一请求而无需进行任何更改。

409

因为和被请求的资源的当前状态之间存在冲突,请求没法完成。这个代码只容许用在这样的状况下才能被使用:用户被认为可以解决冲突,而且会从新提交新的请求。该响应应当包含足够的信息以便用户发现冲突的源头。  冲突一般发生于对PUT请求的处理中。例如,在采用版本检查的环境下,某次PUT提交的对特定资源的修改请求所附带的版本信息与以前的某个(第三方)请求向冲突,那么此时服务器就应该返回一个409错误,告知用户请求没法完成。此时,响应实体中极可能会包含两个冲突版本之间的差别比较,以便用户从新提交归并之后的新版本。

410

被请求的资源在服务器上已经再也不可用,并且没有任何已知的转发地址。这样的情况应当被认为是永久性的。若是可能,拥有连接编辑功能的客户端应当在得到用户许可后删除全部指向这个地址的引用。若是服务器不知道或者没法肯定这个情况是不是永久的,那么就应该使用404状态码。除非额外说明,不然这个响应是可缓存的。  410响应的目的主要是帮助网站管理员维护网站,通知用户该资源已经再也不可用,而且服务器拥有者但愿全部指向这个资源的远端链接也被删除。这类事件在限时、增值服务中很广泛。一样,410响应也被用于通知客户端在当前服务器站点上,本来属于某个我的的资源已经再也不可用。固然,是否须要把全部永久不可用的资源标记为'410 Gone',以及是否须要保持此标记多长时间,彻底取决于服务器拥有者。

411

服务器拒绝在没有定义Content-Length头的状况下接受请求。在添加了代表请求消息体长度的有效Content-Length头以后,客户端能够再次提交该请求。

412

服务器在验证在请求的头字段中给出先决条件时,没能知足其中的一个或多个。这个状态码容许客户端在获取资源时在请求的元信息(请求头字段数据)中设置先决条件,以此避免该请求方法被应用到其但愿的内容之外的资源上。

413

服务器拒绝处理当前请求,由于该请求提交的实体数据大小超过了服务器愿意或者可以处理的范围。此种状况下,服务器能够关闭链接以避免客户端继续发送此请求。  若是这个情况是临时的,服务器应当返回一个Retry-After的响应头,以告知客户端能够在多少时间之后从新尝试。

414

请求的URI长度超过了服务器可以解释的长度,所以服务器拒绝对该请求提供服务。这比较少见,一般的状况包括:  本应使用POST方法的表单提交变成了GET方法,致使查询字符串(Query String)过长。  重定向URI“黑洞”,例如每次重定向把旧的URI做为新的URI的一部分,致使在若干次重定向后URI超长。  客户端正在尝试利用某些服务器中存在的安全漏洞攻击服务器。这类服务器使用固定长度的缓冲读取或操做请求的URI,当GET后的参数超过某个数值后,可能会产生缓冲区溢出,致使任意代码被执行[1]。没有此类漏洞的服务器,应当返回414状态码。

415

对于当前请求的方法和所请求的资源,请求中提交的实体并非服务器中所支持的格式,所以请求被拒绝。

416

若是请求中包含了Range请求头,而且Range中指定的任何数据范围都与当前资源的可用范围不重合,同时请求中又没有定义If-Range请求头,那么服务器就应当返回416状态码。  假如Range使用的是字节范围,那么这种状况就是指请求指定的全部数据范围的首字节位置都超过了当前资源的长度。服务器也应当在返回416状态码的同时,包含一个Content-Range实体头,用以指明当前资源的长度。这个响应也被禁止使用multipart/byteranges做为其Content-Type。

417

在请求头Expect中指定的预期内容没法被服务器知足,或者这个服务器是一个代理服务器,它有明显的证据证实在当前路由的下一个节点上,Expect的内容没法被知足。

421

从当前客户端所在的IP地址到服务器的链接数超过了服务器许可的最大范围。一般,这里的IP地址指的是从服务器上看到的客户端地址(好比用户的网关或者代理服务器地址)。在这种状况下,链接数的计算可能涉及到不止一个终端用户。

422

从当前客户端所在的IP地址到服务器的链接数超过了服务器许可的最大范围。一般,这里的IP地址指的是从服务器上看到的客户端地址(好比用户的网关或者代理服务器地址)。在这种状况下,链接数的计算可能涉及到不止一个终端用户。

422

请求格式正确,可是因为含有语义错误,没法响应。(RFC 4918 WebDAV)423 Locked  当前资源被锁定。(RFC 4918 WebDAV)

424

因为以前的某个请求发生的错误,致使当前请求失败,例如PROPPATCH。(RFC 4918 WebDAV)

425

在WebDav Advanced Collections草案中定义,可是未出如今《WebDAV顺序集协议》(RFC 3658)中。

426

客户端应当切换到TLS/1.0。(RFC 2817)

449

由微软扩展,表明请求应当在执行完适当的操做后进行重试。

500

服务器遇到了一个不曾预料的情况,致使了它没法完成对请求的处理。通常来讲,这个问题都会在服务器的程序码出错时出现。

501

服务器不支持当前请求所须要的某个功能。当服务器没法识别请求的方法,而且没法支持其对任何资源的请求。

502

做为网关或者代理工做的服务器尝试执行请求时,从上游服务器接收到无效的响应。

503

因为临时的服务器维护或者过载,服务器当前没法处理请求。这个情况是临时的,而且将在一段时间之后恢复。若是可以预计延迟时间,那么响应中能够包含一个Retry-After头用以标明这个延迟时间。若是没有给出这个Retry-After信息,那么客户端应当以处理500响应的方式处理它。  注意:503状态码的存在并不意味着服务器在过载的时候必须使用它。某些服务器只不过是但愿拒绝客户端的链接。

504

做为网关或者代理工做的服务器尝试执行请求时,未能及时从上游服务器(URI标识出的服务器,例如HTTP、FTP、LDAP)或者辅助服务器(例如DNS)收到响应。  注意:某些代理服务器在DNS查询超时时会返回400或者500错误

505

服务器不支持,或者拒绝支持在请求中使用的HTTP版本。这暗示着服务器不能或不肯使用与客户端相同的版本。响应中应当包含一个描述了为什么版本不被支持以及服务器支持哪些协议的实体。

506

由《透明内容协商协议》(RFC 2295)扩展,表明服务器存在内部配置错误:被请求的协商变元资源被配置为在透明内容协商中使用本身,所以在一个协商处理中不是一个合适的重点。

507

服务器没法存储完成请求所必须的内容。这个情况被认为是临时的。WebDAV(RFC 4918)

509

服务器达到带宽限制。这不是一个官方的状态码,可是仍被普遍使用。

510

获取资源所须要的策略并无没知足。(RFC 2774)

相关文章
相关标签/搜索