第一个100日计划之 第3天 Servlet003--HTTP响应、状态码、异常处理、过滤器、Cookie

上一篇因为时间关系只总结了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 状态码和相关的信息列表:

代码消息描述
100Continue只有请求的一部分已经被服务器接收,
但只要它没有被拒绝,客户端应继续该请求。
101Switching Protocols服务器切换协议。
200OK请求成功。
201Created该请求是完整的,并创建一个新的资源。
202Accepted该请求被接受处理,但是该处理是不完整的。
203Non-authoritative 
Information
 
204No Content 
205Reset Content 
206Partial Content 
300Multiple Choices链接列表。用户可以选择一个链接,
进入到该位置。最多五个地址。
301Moved Permanently所请求的页面已经转移到一个新的 URL。
302Found所请求的页面已经临时转移到一个新的 URL。
303See Other所请求的页面可以在另一个不同的 URL 下被找到。
304Not Modified 
305Use Proxy 
306Unused在以前的版本中使用该代码。
现在已不再使用它,但代码仍被保留。
307Temporary Redirect所请求的页面已经临时转移到一个新的 URL。
400Bad Request服务器不理解请求。
401Unauthorized所请求的页面需要用户名和密码。
402Payment Required您还不能使用该代码。
403Forbidden禁止访问所请求的页面。
404Not Found服务器无法找到所请求的页面。.
405Method Not Allowed在请求中指定的方法是不允许的。
406Not Acceptable服务器只生成一个不被客户端接受的响应。
407Proxy Authentication
 Required
在请求送达之前,您必须使用代理服务器的验证。
408Request Timeout请求需要的时间比服务器能够等待的时间长,超时。
409Conflict请求因为冲突无法完成。
410Gone所请求的页面不再可用。
411Length Required"Content-Length" 未定义。服务器无法处理客户端
发送的不带 Content-Length 的请求信息。
412Precondition Failed请求中给出的先决条件被服务器评估为 false。
413Request Entity Too Large服务器不接受该请求,因为请求实体过大。
414Request-url Too Long服务器不接受该请求,因为 URL 太长。当您转换一个 "post"
 请求为一个带有长的查询信息的 "get" 请求时发生。
415Unsupported Media Type服务器不接受该请求,因为媒体类型不被支持。
417Expectation Failed 
500Internal Server Error未完成的请求。服务器遇到了一个意外的情况。
501Not Implemented未完成的请求。服务器不支持所需的功能。
502Bad Gateway未完成的请求。服务器从上游服务器收到无效响应。
503Service Unavailable未完成的请求。服务器暂时超载或死机。
504Gateway Timeout网关超时。
505HTTP 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);

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值