Servlet规范系列 之 HttpServletResponse源码分析

欢迎大家关注本博,同时欢迎大家评论交流,可以给个赞哦!!!

  HttpServletResponse是在ServletResponse基础上做的进一步封装,使得其更适用于基于HTTP的服务特性,在原有的ServletResponse API基础上增加了处理HTTP的操作。Servlet容器开发厂商会依据HttpServletResponse API进行具体实现,闲言少叙,接下来让我们看下源码。

  HttpServletResponse

package javax.servlet.http;

import java.io.IOException;

import javax.servlet.ServletResponse;

/**
 * 继承自ServletResponse类,HttpServletResponse提供了HTTP专用的功能. 
 * 例如:HTTP Headers和Cookies的设置.
 * Servlet容器创建HttpServletResponse实例,并将它传递给Servlet的service方法.
 */
public interface HttpServletResponse extends ServletResponse {
    
    

    /**
     * 设置指定Cookie到response中.
     * 可以被多次调用,可以设置多个Cookie.
     * @param Cookie实例.
     */
    public void addCookie(Cookie cookie);
    
    /**
     * 判断response中是否包含某个响应头.
     * @param 响应头名称.
     * @return 存在返回true,否则返回false.
     */
    public boolean containsHeader(String name);

    /**
     * 对指定URL进行编码,编码后包含会话ID,若逻辑判断不需要编码,则返回原URL.
     * 此方法的实现需包括:确定会话ID是否需要包含在编码后的URL中,例如,当浏览器支持Cookie时,或者URL重写(会话跟踪)被关闭时,则不需要URL编码,直接返回原URL.
     * 对于健壮的会话跟踪,Servlet发出的所有URL都应该通过这个方法运行.否则,URL重写不能用于不支持Cookie的浏览器.
     * @param 待编码的URL.
     * @return 已编码的URL.
     */
    public String encodeURL(String url);

    /**
     * 对指定URL进行编码,编码后包含会话ID,若逻辑判断不需要编码,则返回原URL.
     * HttpServletResponse.sendRedirect调用前,需调用此方法进行URL编码.
     * 此方法包括是否包含会话ID的逻辑.
     * 此方法包含会话ID的逻辑与encodeURL(String url)是不同的,所以进行了分离.
     * 所有发送到HttpServletResponse.sendRedirect方法应通过此方法运行,否则,URL重写不能用于不支持cookies的浏览器.
     * @param 待编码的URL.
     * @return 已编码的URL.
     */
    public String encodeRedirectURL(String url);

    /**
     * @deprecated 
     * 已弃用,使用encodeURL(String url).
     */
    public String encodeUrl(String url);

    /**
     * @deprecated 
     * 已弃用,使用encodeRedirectURL(String url).
     */
    public String encodeRedirectUrl(String url);

    /**
     * 写入指定的状态码和错误描述信息,并清除缓冲区,将错误响应给客户端.
     * 如果响应已经提交,此方法将抛出一个IllegalStateException,使用此方法后,应将响应视为已提交,不应写入.
     * @param 错误状态码.
     * @param 错误描述信息.
     */
    public void sendError(int sc, String msg) throws IOException;

    /**
     * 写入指定的状态码,并清除缓冲区,将错误响应给客户端.
     * 如果响应已经提交,此方法将抛出一个IllegalStateException,使用此方法后,应将响应视为已提交,不应写入.
     * @param 错误状态码.
     */
    public void sendError(int sc) throws IOException;

    /**
     * 使用指定的重定向位置URL向客户端发送临时重定向响应.
     * 此方法可以接受相对URL,Servlet容器必须在向客户机发送响应之前将相对URL转换为绝对URL.
     * 如果位置是相对的而没有前导"/",容器会将其解释为相对于当前请求URI.
     * 如果位置与前导"/"相关,则容器会将其解释为相对于servlet容器根.
     * 如果响应已经提交,此方法将抛出一个IllegalStateException,使用此方法后,应将响应视为已提交,不应写入.
     * @param 重定向地址.
     */
    public void sendRedirect(String location) throws IOException;

    /**
     * 设置Date类型头信息.若已经存在指定的头,则会覆盖.
     * @param 头名称.
     * @param 头值.
     */
    public void setDateHeader(String name, long date);

    /**
     * 新增Date类型头信息.不管是否存在,都会追加,可允许存在多个同名的头.
     * @param 头名称.
     * @param 头值.
     */
    public void addDateHeader(String name, long date);

    /**
     * 设置头信息.若已经存在指定的头,则会覆盖.
     * @param 头名称.
     * @param 头值.
     */
    public void setHeader(String name, String value);

    /**
     * 新增头信息.不管是否存在,都会追加,可允许存在多个同名的头.
     * @param 头名称.
     * @param 头值.
     */
    public void addHeader(String name, String value);

    /**
     * 设置int类型头信息.若已经存在指定的头,则会覆盖.
     * @param 头名称.
     * @param 头值.
     */
    public void setIntHeader(String name, int value);

    /**
     * 新增int类型头信息.不管是否存在,都会追加,可允许存在多个同名的头.
     * @param 头名称.
     * @param 头值.
     */
    public void addIntHeader(String name, int value);

    /**
     * 设置response的状态码.
     * 此方法被用来设置成功状态码,出现错误设置状态码使用sendError方法.
     * 例如:SC_OK、SC_MOVED_TEMPORARILY.
     * @param 状态码.
     */
    public void setStatus(int sc);

    /**
     * @deprecated 
     * 设置response的状态码.
     * 此方法被用来设置成功状态码,出现错误设置状态码使用sendError方法.
     * 例如:SC_OK、SC_MOVED_TEMPORARILY.
     * @param 状态码.
     * @param 状态描述.
     */
    public void setStatus(int sc, String sm);

    /*
     * 服务端响应状态码. 参考查看RFC 2068标准.
     */
    /**
     * CONTINUE:继续,客户端应继续其请求.
     */
    public static final int SC_CONTINUE = 100;

    /**
     * SWITCHING_PROTOCOLS:切换协议。服务器根据客户端的请求切换协议.只能切换到更高级的协议,例如,切换到HTTP的新版本协议.
     */
    public static final int SC_SWITCHING_PROTOCOLS = 101;

    /**
     * OK:请求成功.一般用于GET与POST请求.
     */
    public static final int SC_OK = 200;

    /**
     * CREATED:已创建.成功请求并创建了新的资源.
     */
    public static final int SC_CREATED = 201;

    /**
     * ACCEPTED:已接受.已经接受请求,但未处理完成.
     */
    public static final int SC_ACCEPTED = 202;

    /**
     * NON_AUTHORITATIVE_INFORMATION:非授权信息.请求成功.但返回的meta信息不在原始的服务器,而是一个副本.
     */
    public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;

    /**
     * NO_CONTENT:无内容.服务器成功处理,但未返回内容.在未更新网页的情况下,可确保浏览器继续显示当前文档.
     */
    public static final int SC_NO_CONTENT = 204;

    /**
     * RESET_CONTENT:重置内容.服务器处理成功,用户终端(例如:浏览器)应重置文档视图.可通过此返回码清除浏览器的表单域.
     */
    public static final int SC_RESET_CONTENT = 205;

    /**
     * PARTIAL_CONTENT:部分内容.服务器成功处理了部分GET请求.
     */
    public static final int SC_PARTIAL_CONTENT = 206;

    /**
     * MULTIPLE_CHOICES:多种选择.请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择.
     */
    public static final int SC_MULTIPLE_CHOICES = 300;

    /**
     * SC_MOVED_PERMANENTLY:永久移动.请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI.今后任何新的请求都应使用新的URI代替.
     */
    public static final int SC_MOVED_PERMANENTLY = 301;

    /**
     * MOVED_TEMPORARILY:临时移动.与301类似.但资源只是临时被移动.客户端应继续使用原有URI.
     */
    public static final int SC_MOVED_TEMPORARILY = 302;

    /**
     * SC_FOUND:临时移动.与301类似.但资源只是临时被移动.客户端应继续使用原有URI.
     */
    public static final int SC_FOUND = 302;

    /**
     * SEE_OTHER:查看其它地址.与301类似.使用GET和POST请求查看.
     */
    public static final int SC_SEE_OTHER = 303;

    /**
     * NOT_MODIFIED:未修改.所请求的资源未修改,服务器返回此状态码时,不会返回任何资源.客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源.
     */
    public static final int SC_NOT_MODIFIED = 304;

    /**
     * USE_PROXY:使用代理.所请求的资源必须通过代理访问.
     */
    public static final int SC_USE_PROXY = 305;

    /**
     * TEMPORARY_REDIRECT:临时重定向.与302类似.使用GET请求重定向.
     */
    public static final int SC_TEMPORARY_REDIRECT = 307;

    /**
     * BAD_REQUEST:客户端请求的语法错误,服务器无法理解.
     */
    public static final int SC_BAD_REQUEST = 400;

    /**
     * UNAUTHORIZED:请求要求用户的身份认证.
     */
    public static final int SC_UNAUTHORIZED = 401;

    /**
     * PAYMENT_REQUIRED:保留,将来使用.
     */
    public static final int SC_PAYMENT_REQUIRED = 402;

    /**
     * FORBIDDEN:服务器理解请求客户端的请求,但是拒绝执行此请求.
     */
    public static final int SC_FORBIDDEN = 403;

    /**
     * NOT_FOUND:服务器无法根据客户端的请求找到资源(网页).通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面.
     */
    public static final int SC_NOT_FOUND = 404;

    /**
     * METHOD_NOT_ALLOWED:客户端请求中的方法被禁止.
     */
    public static final int SC_METHOD_NOT_ALLOWED = 405;

    /**
     * NOT_ACCEPTABLE:服务器无法根据客户端请求的内容特性完成请求.
     */
    public static final int SC_NOT_ACCEPTABLE = 406;

    /**
     * PROXY_AUTHENTICATION_REQUIRED:请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权.
     */
    public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;

    /**
     * REQUEST_TIMEOUT:服务器等待客户端发送的请求时间过长,超时.
     */
    public static final int SC_REQUEST_TIMEOUT = 408;

    /**
     * CONFLICT:服务器完成客户端的PUT请求时可能返回此代码,服务器处理请求时发生了冲突.
     */
    public static final int SC_CONFLICT = 409;

    /**
     * GONE:客户端请求的资源已经不存在.410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置.
     */
    public static final int SC_GONE = 410;

    /**
     * LENGTH_REQUIRED:服务器无法处理客户端发送的不带Content-Length的请求信息.
     */
    public static final int SC_LENGTH_REQUIRED = 411;

    /**
     * PRECONDITION_FAILED:客户端请求信息的先决条件错误.
     */
    public static final int SC_PRECONDITION_FAILED = 412;

    /**
     * REQUEST_ENTITY_TOO_LARGE:由于请求的实体过大,服务器无法处理,因此拒绝请求.为防止客户端的连续请求,服务器可能会关闭连接.如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息.
     */
    public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;

    /**
     * SC_REQUEST_URI_TOO_LONG:请求的URI过长(URI通常为网址),服务器无法处理.
     */
    public static final int SC_REQUEST_URI_TOO_LONG = 414;

    /**
     * UNSUPPORTED_MEDIA_TYPE:服务器无法处理请求附带的媒体格式.
     */
    public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;

    /**
     * REQUESTED_RANGE_NOT_SATISFIABLE:客户端请求的范围无效.
     */
    public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;

    /**
     * EXPECTATION_FAILED:服务器无法满足Expect的请求头信息.
     */
    public static final int SC_EXPECTATION_FAILED = 417;

    /**
     * INTERNAL_SERVER_ERROR:服务器内部错误,无法完成请求.
     */
    public static final int SC_INTERNAL_SERVER_ERROR = 500;

    /**
     * NOT_IMPLEMENTED:服务器不支持请求的功能,无法完成请求.
     */
    public static final int SC_NOT_IMPLEMENTED = 501;

    /**
     * BAD_GATEWAY:作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应.
     */
    public static final int SC_BAD_GATEWAY = 502;

    /**
     * SERVICE_UNAVAILABLE:由于超载或系统维护,服务器暂时的无法处理客户端的请求.延时的长度可包含在服务器的Retry-After头信息中.
     */
    public static final int SC_SERVICE_UNAVAILABLE = 503;

    /**
     * GATEWAY_TIMEOUT:充当网关或代理的服务器,未及时从远端服务器获取请求.
     */
    public static final int SC_GATEWAY_TIMEOUT = 504;

    /**
     * GATEWAY_TIMEOUT:服务器不支持请求的HTTP协议的版本,无法完成处理.
     */
    public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
    
}

  HttpServletResponse API增加的方法相对较少,源码中大部分都是对响应状态码的定义,定义了开发及使用过程中可能用到的所有响应状态码。

  若文中存在错误和不足,欢迎指正!

本博微信公众号“超哥说码”,欢迎大家订阅,公众号正在完善中,会及时将更优质的博文推送于您!
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/securitit/article/details/108046131
今日推荐