总启:
Web服务器与客户端之间的http请求,每一次请求创建一对request对象和需要找response对象。两者分别表示请求和响应。
1,HttpServletRequest源码分析
public interface HttpServletRequest extends ServletRequest {
public static final String BASIC_AUTH = "BASIC"; 基础验证
public static final String FORM_AUTH = "FORM"; 表单验证
public static final String CLIENT_CERT_AUTH = "CLIENT_CERT"; 客户端证书验证
public static final String DIGEST_AUTH = "DIGEST"; 摘要式身份验证
public String getAuthType(); 返回验证方式
public Cookie[] getCookies();获得请求Cookies
public long getDateHeader(String name); 得到请求发送时格林时间
public String getHeader(String name); 得到请求头
public Enumeration<String> getHeaders(String name); 得到一组请求头
public Enumeration<String> getHeaderNames(); 得到一组请求头名
public int getIntHeader(String name); 得到int型的请求头
public String getMethod(); 返回http方法名比如GET, POST, or PUT
public String getPathInfo(); 返回关联路径信息(请求路径)
public String getPathTranslated(); 返回servlet名称后面的任何额外路径信息
public String getContextPath();返回请求URI中指示请求上下文的部分
public String getQueryString();返回路径后请求URL中包含的查询字符串
public String getRemoteUser();返回发出此请求的用户的登录名
public boolean isUserInRole(String role); 已验证用户是否包含在指定的逻辑“角色”中
public java.security.Principal getUserPrincipal(); 返回包含当前已验证用户的名称的对象
public String getRequestedSessionId();返回客户端指定的会话ID
public String getRequestURI();返回从协议名到HTTP请求第一行中的查询字符串的此请求的URL部分。
public StringBuffer getRequestURL(); 重建客户端用于发出请求的URL。返回的URL包含协议、服务器名称、port编号和服务器路径,但不包含查询字符串参数
public String getServletPath();返回此请求的URL中调用servlet的部分
public HttpSession getSession(boolean create); 返回与此请求关联的当前会话,否则返回创建的新会话。
public HttpSession getSession();返回与此请求关联的当前会话,否则返回创建的新会话。
public String changeSessionId(); 返回改变当前会话的id,或返回一个新的会话id
public boolean isRequestedSessionIdValid(); 检查请求的会话ID是否仍然有效
public boolean isRequestedSessionIdFromCookie(); 检查请求的会话ID是否作为cookie传入
public boolean isRequestedSessionIdFromURL();检查请求的会话ID是否作为请求URL的一部分传入
public boolean authenticate(HttpServletResponse response)
throws IOException,ServletException; 使用为servletContext配置的容器登录机制来验证发出此请求的用户
public void login(String username, String password)
throws ServletException; 验证为servletcontext配置的Web容器登录机制使用的密码验证域中提供的用户名和密码。
public void logout() throws ServletException; 在请求时调用getUserPrincipal、getRemoteUser和getAuthType时,将返回的值设置为null
public Collection<Part> getParts() throws IOException, ServletException; 获取此请求的所有@link part组件,前提是它的类型为multipart/form data。
public Part getPart(String name) throws IOException, ServletException; 获取具有给定名称的@链接部分
public <T extends HttpUpgradeHandler> T upgrade(Class<T> handlerClass)
throws IOException, ServletException; 为给定类创建httpupgradeHandler的实例,并将其用于HTTP协议升级处理
}
2,HttpServletResponse源码分析
public interface HttpServletResponse extends ServletResponse {
public void addCookie(Cookie cookie); 添加Cookie
public boolean containsHeader(String name); 是否已设置命名响应头
public String encodeURL(String url); 对指定url进行编码
public String encodeRedirectURL(String url); 对RedirectURL进行编码
public void sendError(int sc, String msg) throws IOException; 使用指定的状态向客户端发送错误响应并清除缓冲区
public void sendError(int sc) throws IOException;
public void sendRedirect(String location) throws IOException; 重定向位置URL向客户端发送临时重定向响应并清除缓冲区
public void setDateHeader(String name, long date);设置响应头的名称和日期
public void addDateHeader(String name, long date); 添加响应头的名称和时间
public void setHeader(String name, String value); 设置响应头的名称和值
public void addHeader(String name, String value); 添加响应头的名称和值
public void setIntHeader(String name, int value);设置响应头的名称和int类型的值
public void addIntHeader(String name, int value); 添加响应头的名称和int类型的值
public void setStatus(int sc); 设置此响应的状态代码
public void setStatus(int sc, String sm); 设置状态码,和代表信息
public int getStatus(); 得到当前返回的状态码
public String getHeader(String name); 获取给定名称的响应头的值
public Collection<String> getHeaders(String name); 获取给定名称响应头的值,返回集合泛型string
public Collection<String> getHeaderNames(); 获取响应头的名称,返回集合泛型string
public static final int SC_CONTINUE = 100; 指示客户端可以继续
public static final int SC_SWITCHING_PROTOCOLS = 101; 服务器正在根据升级头交换协议
// 2开头 (请求成功)表示成功处理了请求的状态代码。
public static final int SC_OK = 200; 请求正常
public static final int SC_CREATED = 201; (已创建) 请求成功并且服务器创建了新的资源
public static final int SC_ACCEPTED = 202;(已接受) 服务器已接受请求,但尚未处理
public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;(非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
public static final int SC_NO_CONTENT = 204;(无内容) 服务器成功处理了请求,但没有返回任何内容。
public static final int SC_RESET_CONTENT = 205;(重置内容) 服务器成功处理了请求,但没有返回任何内容。
public static final int SC_PARTIAL_CONTENT = 206;(部分内容) 服务器成功处理了部分 GET 请求。
//3开头 (请求被重定向)表示要完成请求,需要进一步操作。
public static final int SC_MULTIPLE_CHOICES = 300; (多种选择) 针对请求,服务器可执行多种操作。
public static final int SC_MOVED_PERMANENTLY = 301; (永久移动) 请求的网页已永久移动到新位置。
public static final int SC_MOVED_TEMPORARILY = 302;(临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
public static final int SC_FOUND = 302;
public static final int SC_SEE_OTHER = 303;(查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
public static final int SC_NOT_MODIFIED = 304;(未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
public static final int SC_USE_PROXY = 305;(使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
public static final int SC_TEMPORARY_REDIRECT = 307;(临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
//4开头 (请求错误)
public static final int SC_BAD_REQUEST = 400; (错误请求) 服务器不理解请求的语法。
public static final int SC_UNAUTHORIZED = 401;(未授权) 请求要求身份验证。
public static final int SC_PAYMENT_REQUIRED = 402; 服务器的配置导致登录失败
public static final int SC_FORBIDDEN = 403;(禁止) 服务器拒绝请求。
public static final int SC_NOT_FOUND = 404;(未找到) 服务器找不到请求的网页。
public static final int SC_METHOD_NOT_ALLOWED = 405;(方法禁用) 禁用请求中指定的方法。
public static final int SC_NOT_ACCEPTABLE = 406;(不接受) 无法使用请求的内容特性响应请求的网页。
public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;需要代理授权) 此状态代码与 401(未授权)类似
public static final int SC_REQUEST_TIMEOUT = 408;(请求超时) 服务器等候请求时发生超时。
public static final int SC_CONFLICT = 409;(冲突) 服务器在完成请求时发生冲突。
public static final int SC_GONE = 410;(已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
public static final int SC_LENGTH_REQUIRED = 411;(需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
public static final int SC_PRECONDITION_FAILED = 412;(未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;(请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
public static final int SC_REQUEST_URI_TOO_LONG = 414;(请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;(不支持的媒体类型) 请求的格式不受请求页面的支持。
public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;(请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
public static final int SC_EXPECTATION_FAILED = 417;(未满足期望值) 服务器未满足”期望”请求标头字段的要求。
5开头(服务器错误)
public static final int SC_INTERNAL_SERVER_ERROR = 500;(服务器内部错误) 服务器遇到错误,无法完成请求。
public static final int SC_NOT_IMPLEMENTED = 501;(尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
public static final int SC_BAD_GATEWAY = 502; 服务器作为网关或代理,从上游服务器收到无效响应
public static final int SC_SERVICE_UNAVAILABLE = 503; HTTP服务器暂时过载,无法处理请求
public static final int SC_GATEWAY_TIMEOUT = 504; 服务器作为网关或代理,但是没有及时从上游服务器收到请求
public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505; 服务器不支持或拒绝支持请求消息中使用的HTTP协议版本
}
进一步分析我们可以看到上面这两者继承了ServletRequest和ServletResponse,其实很多的方法就在其中。
首先说重要的,ServletResponse我需要比ServletRequest更深的理解。
ServletResponse源码分析:
public interface ServletResponse {
public String getCharacterEncoding(); 返回编码code名
public String getContentType(); 返回用于此响应中发送的mime主体的内容类型,例如:text/html; charset=UTF-8
public ServletOutputStream getOutputStream() throws IOException;
返回一个@link servletoutputstream适合在响应中写入二进制数据。servlet容器不编码二进制数据
public PrintWriter getWriter() throws IOException; 返回可向客户端发送字符文本PrintWriter
public void setCharacterEncoding(String charset); 设置响应头编码
public void setContentLengthLong(long len);设置HTTP内容头长度
public void setContentType(String type);设置发送到客户端的响应的内容类型
public void setBufferSize(int size);设置响应主体的首选缓冲区大小
public int getBufferSize(); 返回相应头的缓冲区大小
public void flushBuffer() throws IOException; 强制将缓冲区中的任何内容写入客户端
public void resetBuffer(); 清除响应中基础缓冲区的内容,而不清除头或状态代码
public boolean isCommitted(); 是否已提交响应
public void reset(); 清除缓冲区中存在的任何数据以及状态代码、头
public void setLocale(Locale loc); 如果相应还没有被提交,设置响应的区域设置
public Locale getLocale(); 返回响应的区域设置
}
ServletRequest源码分析
public interface ServletRequest {
public Object getAttribute(String name); 根据名称获取属性
public Enumeration<String> getAttributeNames(); 获取所有属性。string的枚举
public String getCharacterEncoding(); 返回编码code
public void setCharacterEncoding(String env) throws UnsupportedEncodingException;设置字符编码
public long getContentLengthLong();返回请求正文的长度
public String getContentType();返回MIME类型的请求主体
public ServletInputStream getInputStream() throws IOException; 返回包含请求正文的@link servletinputstream对象
public String getParameter(String name);根据名称返回请求参数
public Enumeration<String> getParameterNames();返回所有请求参数名
public String[] getParameterValues(String name);返回包含参数值的对象数组
public Map<String, String[]> getParameterMap();返回map,其中参数名作为键,参数值作为映射值
public String getProtocol(); 返回协议名称和版本号
public String getScheme();返回发出此请求的方案的名称
public String getServerName(); 返回服务器名称
public int getServerPort();返回服务器端口
public BufferedReader getReader() throws IOException; 返回包含请求正文的BufferedReader
public String getRemoteAddr(); 返回发送请求的客户端或上一个代理的Internet协议(IP)地址
public String getRemoteHost();返回客户端的完全限定名的字符串
public void setAttribute(String name, Object o);在此请求中存储属性,键值对形式
public void removeAttribute(String name);根据名称移除属性
public Locale getLocale();返回客户端的首选locale
public Enumeration<Locale> getLocales(); 返回所有客户端的locale
public boolean isSecure(); 请求是否安全https/http
public RequestDispatcher getRequestDispatcher(String path);返回一个requestDispatcher对象,该对象充当指定路径上资源的wrapper。
public String getRealPath(String path); 根据路径得到全路径,局限2.1版本
public int getRemotePort(); 返回Internet协议(IP)源端口
public String getLocalName();返回Internet协议(IP)接口的主机名。
public String getLocalAddr();返回请求的Internet协议(IP)地址
public int getLocalPort(); 返回请求的Internet协议(IP)端口
public ServletContext getServletContext();返回servletrequest上次调度到的servlet上下文
public AsyncContext startAsync() throws IllegalStateException;返回(重新)初始化的AsyncContext
public AsyncContext startAsync(ServletRequest servletRequest,
ServletResponse servletResponse)
throws IllegalStateException;返回(重新)初始化的AsyncContext
public boolean isAsyncStarted();返回是否被置于异步模式
public boolean isAsyncSupported();返回是否请求支持异步操作
public AsyncContext getAsyncContext(); 创建或重新初始化的AsyncContext,需带参数
public DispatcherType getDispatcherType();返回dispatcher请求类型
}
虽然分析了这么多,还是要在实际中遇到才能加深印象。继续加油!???????
关于response.setHeader(String name, String value)的常用:
详尽解释参考:https://blog.csdn.net/junmoxi/article/details/76976692