上一篇因为时间关系只总结了servlet HTTP请求的请求头以及对应servletAPI,以及一些演示。本篇继续总结,进入HTTP响应。
一、Servlet服务器HTTP响应
1.1响应头分析
头信息 | 描述 |
Allow | 指定服务器支持的请求方法(GET、POST 等) |
Cache-Control | 指定响应文档在何种情况下可以安全地缓存,取值有 public意味着文档是可缓存,private意味着文档是单个用户私用文档,且只能存储在私有(非共享)缓存中,no-cache保护缓存 |
Connection | 指示浏览器是否使用持久 HTTP 连接,值 close 指示浏览器不使用持久 HTTP 连接,值 keep-alive 意味着使用持久连接 |
Content-Disposition | 可以让您请求浏览器要求用户以给定名称的文件把响应保存到磁盘 |
Content-Encoding | 在传输过程中,这个头信息指定页面的编码方式 |
Content-Language | 表示文档编写所使用的语言。例如,en、en-us、ru 等 |
Content-Length | 指示响应中的字节数。只有当浏览器使用持久(keep-alive)HTTP 连接时才需要这些信息 |
Content-Type | 提供了响应文档的 MIME(Multipurpose Internet Mail Extension)类型 |
Expires | 指定内容过期的时间,在这之后内容不再被缓存 |
Last-Modified | 指示文档的最后修改时间 |
Location | 包含在所有的带有状态码的响应中。在 300s 内,这会通知浏览器文档的地址。浏览器会自动重新连接到这个位置,并获取新的文档 |
Refresh | 指定浏览器应该如何尽快请求更新的页面 |
Retry-After | 这个头信息可以与 503(Service Unavailable 服务不可用)响应配合使用,这会告诉客户端多久就可以重复它的请求 |
Set-Cookie | 指定一个与页面关联的 cookie |
部分参数截图:
1.2 Servlet设置响应头的API
- String encodeRedirectURL(String url):为 sendRedirect 方法中使用的指定的 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变
- String encodeURL(String url):对包含 session 会话 ID 的指定 URL 进行编码,或者如果编码不是必需的,则返回 URL 未改变
- boolean containsHeader(String name):返回一个布尔值,指示是否已经设置已命名的响应报头
- boolean isCommitted():返回一个布尔值,指示响应是否已经提交.
- void addCookie(Cookie cookie):把指定的 cookie 添加到响应
- void addDateHeader(String name, long date):添加一个带有给定的名称和日期值的响应报头
- void addHeader(String name, String value):添加一个带有给定的名称和值的响应报头
- void addIntHeader(String name, int value):添加一个带有给定的名称和整数值的响应报头
- void flushBuffer():强制任何在缓冲区中的内容被写入到客户端
- void reset():清除缓冲区中存在的任何数据,包括状态码和头
- void resetBuffer():清除响应中基础缓冲区的内容,不清除状态码和头
- void sendError(int sc, String msg):使用指定的状态发送错误响应到客户端
- void sendRedirect(String location):使用指定的重定向位置 URL 发送临时重定向响应到客户端
- void setBufferSize(int size):为响应主体设置首选的缓冲区大小
- void setCharacterEncoding(String charset):设置被发送到客户端的响应的字符编码(MIME 字符集)例如,UTF-8
- void setContentLength(int len):设置在 HTTP Servlet 响应中的内容主体的长度,该方法设置 HTTP Content-Length 头
- void setContentType(String type):如果响应还未被提交,设置被发送到客户端的响应的内容类型。
- void setDateHeader(String name, long date):设置一个带有给定的名称和日期值的响应报头
- void setHeader(String name, String value):设置一个带有给定的名称和值的响应报头
- void setIntHeader(String name, int value):设置一个带有给定的名称和整数值的响应报头
- void setLocale(Locale loc):如果响应还未被提交,设置响应的区域
- void setStatus(int sc):为该响应设置状态码
1.3 部分API演示
结果:
二、Servlet HTTP状态码
2.1HTTP 状态码和相关的信息列表:
代码 | 消息 | 描述 |
100 | Continue | 只有请求的一部分已经被服务器接收, 但只要它没有被拒绝,客户端应继续该请求。 |
101 | Switching Protocols | 服务器切换协议。 |
200 | OK | 请求成功。 |
201 | Created | 该请求是完整的,并创建一个新的资源。 |
202 | Accepted | 该请求被接受处理,但是该处理是不完整的。 |
203 | Non-authoritative Information | |
204 | No Content | |
205 | Reset Content | |
206 | Partial Content | |
300 | Multiple Choices | 链接列表。用户可以选择一个链接, 进入到该位置。最多五个地址。 |
301 | Moved Permanently | 所请求的页面已经转移到一个新的 URL。 |
302 | Found | 所请求的页面已经临时转移到一个新的 URL。 |
303 | See Other | 所请求的页面可以在另一个不同的 URL 下被找到。 |
304 | Not Modified | |
305 | Use Proxy | |
306 | Unused | 在以前的版本中使用该代码。 现在已不再使用它,但代码仍被保留。 |
307 | Temporary Redirect | 所请求的页面已经临时转移到一个新的 URL。 |
400 | Bad Request | 服务器不理解请求。 |
401 | Unauthorized | 所请求的页面需要用户名和密码。 |
402 | Payment Required | 您还不能使用该代码。 |
403 | Forbidden | 禁止访问所请求的页面。 |
404 | Not Found | 服务器无法找到所请求的页面。. |
405 | Method Not Allowed | 在请求中指定的方法是不允许的。 |
406 | Not Acceptable | 服务器只生成一个不被客户端接受的响应。 |
407 | Proxy Authentication Required | 在请求送达之前,您必须使用代理服务器的验证。 |
408 | Request Timeout | 请求需要的时间比服务器能够等待的时间长,超时。 |
409 | Conflict | 请求因为冲突无法完成。 |
410 | Gone | 所请求的页面不再可用。 |
411 | Length Required | "Content-Length" 未定义。服务器无法处理客户端 发送的不带 Content-Length 的请求信息。 |
412 | Precondition Failed | 请求中给出的先决条件被服务器评估为 false。 |
413 | Request Entity Too Large | 服务器不接受该请求,因为请求实体过大。 |
414 | Request-url Too Long | 服务器不接受该请求,因为 URL 太长。当您转换一个 "post" 请求为一个带有长的查询信息的 "get" 请求时发生。 |
415 | Unsupported Media Type | 服务器不接受该请求,因为媒体类型不被支持。 |
417 | Expectation Failed | |
500 | Internal Server Error | 未完成的请求。服务器遇到了一个意外的情况。 |
501 | Not Implemented | 未完成的请求。服务器不支持所需的功能。 |
502 | Bad Gateway | 未完成的请求。服务器从上游服务器收到无效响应。 |
503 | Service Unavailable | 未完成的请求。服务器暂时超载或死机。 |
504 | Gateway Timeout | 网关超时。 |
505 | HTTP Version Not Supported | 服务器不支持"HTTP协议"版本。 |
2.2 Servlet 设置HTTP状态方法
- public void setStatus ( int statusCode ):该方法设置一个任意的状态码
- public void sendRedirect(String url):该方法生成一个 302 响应,连同一个带有新文档 URL 的 Location头
- public void sendError(int code, String message):该方法发送一个状态码(通常为 404),连同一个在 HTML 文档内部自动格式化并发送到客户端的短消息
2.3 API演示
三、Servlet过滤器Filter
3.1功能及应用场景介绍
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
在客户端的请求访问后端资源之前,拦截这些请求,做一些预处理。
在服务器的响应发送回客户端之前,处理这些响应
规范建议使用一下过滤器组件:(其实也可以不用)
Authentication filters //用户身份验证过滤器
Logging and auditing filters //日志记录与审计过滤器
Image conversion filters //图片转换过滤器
Data compression filters //数据压缩过滤器
Encryption filters //加密过滤器
Tokenizing filters //分词过滤
Filters that trigger resource access events //触发资源访问事件过滤
XSL/T filters that transform XML content
MIME-type chain filters //MIME-TYPE 链过滤器
Caching filters //缓存过滤器
过滤器一般在web.xml种配置,也可以通过注解配置。当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
3.2 Servlet过滤器接口Filter方法介绍
- public void doFilter (ServletRequest, ServletResponse, FilterChain) 该方法完成实际的过滤操作,当客户端请求方法与过滤器设置匹配的URL时,Servlet容器将先调用过滤器的doFilter方法。FilterChain用户访问后续过滤器
- public void init(FilterConfig filterConfig) 过滤器初始化方法,filter对象只会创建一次,filterConfig对象封装一些配置信息,filterConfig可以在web.xml种配置,也可以通过注解的方式配置。
- public void destroy():销毁filter对象时调用此方法,可以用来释放资源等操作。
3.3 filter实例
3.3.1 基于web.xml配置方式
web.xml配置
启动服务器,验证过滤器初始化参数:
访问几次前面的一些请求:
此处验证了一个 等式:requestURI = contextPath + servletPath + pathInfo 是成立的!!
3.3.2 基于注解的方式
对应servlet:
页面输出乱码:
四、Servlet异常处理
在web.xml文件种使用error-page元素来指定对特定异常或者HTTP状态码做出相应的servlet调用。
4.1servlet异常处理演示
web.xml配置:分按照状态码和异常类型2种方式配置,实际开发种可以依据不同的异常配置不同的异常处理Servlet
异常处理的Servlet:
验证方式1:状态码(访问不存在的请求)
验证方式2:写一个抛异常的Servlet
页面输出:
4.2 异常servlet相关属性解释
- javax.servlet.error.status_code:该属性给出状态码(Integer)
- javax.servlet.error.exception_type:该属性给出异常类型的信息(Class)
- javax.servlet.error.message:该属性给出确切错误消息的信息(String)
- javax.servlet.error.request_uri:该属性给出有关 URL 调用 Servlet 的信息(String)
- javax.servlet.error.exception:该属性给出异常产生的信息(Throwable )
- javax.servlet.error.servlet_name:该属性给出 Servlet 的名称(String)
五、Cookie 处理
5.1 cookie概念
Cookie 是存储在客户端计算机上的文本文件,并保留了各种跟踪信息。Servlet识别返回用户包括三个步骤:
- 服务器脚本向浏览器发送一组 Cookie。例如:姓名、年龄或识别号码等
- 浏览器将这些信息存储在本地计算机上,以备将来使用
- 当下一次浏览器向 Web 服务器发送任何请求时,浏览器会把这些 Cookie 信息发送到服务器,服务器将使用这些信息来识别用户
本部分主要总结Servlet如何设置或者重置,访问、删除Cookie等操作。Cookie 通常设置在 HTTP 头信息中,设置 Cookie 的 Servlet 会发送如下的头信息:
HTTP/1.1 200 OKDate: Fri, 04 Feb 2000 21:03:38 GMTServer: Apache/1.3.9 (UNIX) PHP/4.0b3Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT;
path=/; domain=w3cschool.ccConnection: closeContent-Type: text/html
其中包含:
5.2 Cookie的API
- public void setDomain(String pattern):该方法设置 cookie 适用的域
- public String getDomain():获取 cookie 适用的域
- public void setMaxAge(int expiry):设置 cookie 过期的时间(以秒为单位),如果不设置,只在当前session会话中有效。
- public int getMaxAge():该方法返回 cookie 的有效时间(s),返回-1 表示永久有效,直到浏览器关闭
- public String getName():返回 cookie 的名称。名称在创建后不能改变
- public void setValue(String newValue):设置与 cookie 关联的值
- public String getValue():获取与 cookie 关联的值
- public void setPath(String uri):该方法设置 cookie 适用的路径。如果不指定路径,与当前页面相同目录下的(包括子目录下的)所有 URL 都会返回 cookie
- public String getPath():获取 cookie 适用的路径
- public void setSecure(boolean flag):设置布尔值,表示 cookie 是否应该只在加密的(即 SSL)连接上发送
- public void setComment(String purpose):设置cookie的注释。该注释在浏览器向用户呈现 cookie 时非常有用
- public String getComment():获取 cookie 的注释,如果 cookie 没有注释则返回 null
5.3 Servlet设置Cookie
第一步:创建Cookie对象 Cookie cookie=new Cookie("key","value"),注意k/v不能包含如下特殊字符
[ ] ( ) = , " / ? @ : ;
第二步:设置有效时间 cookie.setMaxAge(秒)
第三步: 发送cookie到响应头 resp.addCookie(cookie)
5.4 实例
5.4.1 设置Cookie以登陆页面演示
页面:
servlet:
结果:
5.4.2 获取Cookie
servlet:
结果:
另外删除cookie只需将macAge设置为0即可,cookie.setMaxAge(0);