天天看点

Servlet 请求(第三篇)

request对象包含所有客户的信息,在HTTP协议中,这些信息 是通过header和body传递到服务端

3.1、HTTP 协议参数

  • 请求参数是通过字符串传送服务器的
  • 请求参数是key-value的模式
  • 下列方法可获取参数
    • getParameter 获取第一个参数
    • getParameterNames 获取所有参数的名称
    • getParameterValues 获取所有参数的值
    • getParameterMap 获取key-value的map
  • 例子
    • 比如一个查询条件是 a=hello , 一个post的body入参 a=goodbye&a=world
      那么结果参数: a=(hello, goodbye, world)
                 
  • path参数只是GET请求独有特性(在HTTP1.1), 他必须通过getRequestURI方法或getPathInfo方法

3.1.1、当参数是可获取的时候

  • post 表单提交必须满足如下要求
    1. 请求是一个HTTP或HTTPS请求
    2. HTTP的方式是POST
    3. 内容格式 application/x-www-form-urlencoded
    4. servlet 对应任何getParameter做参数初始化处理
  • 如果不满足上面的要求,那么获取参数只能通过inputStream获取,满足就不能通过inputStream获取

3.2、文件上传

  • servlet容器允许文件上传的,内容格式是multipart/form-data
  • 以下任意一个条件被满足,servlet容器按照multipart/form-data格式处理
    • 请求被标记@MultipartConfig
    • 部署描述符包含multipart-config元素去处理这个请求
  • servlet容器提供multipart/form-data处理功能,那么数据可以通过哪些HttpServletRequest方法获得
    • public Collection getParts()
    • public Part getPart(String name )
    • 每个Part都可以获取头部信息、内容信息,以及文件本身的信息,通过方法Part.getInputStream方法
  • 如果servlet容器并不提供multi-part/form-data处理,那么文件数据可以通过HttpServletRequest.getInputStream

3.3、属性

  • 属性对参数一种补充
  • 属性servlet之间传递信息(通过RequestDispatcher)
  • 获取和设置属性的接口和方法如下ServletRequest
    • getAttribute
    • getAttributeNames
    • setAttribute
  • 还一点与参数不同地方,属性值只能与一个属性名关联。
  • 在属性key命名时候,推荐遵循java包命名方法,不用使用java或oracle,sun开头保留

3.4、请求头

  • 获取请求头方法(HttpServletRequest)
    • getHeader
    • getHeaders
    • getHeaderNames
  • 一个header的name 可以对应多个值, 如果获取第一个header值可通过getHeader方法获取,如果获得所有的值可以通过getHeaders,
  • header还提供一些格式转换的方法
    • getIntHeader 将获取字符串转换成int类型 (转换不成功将会抛出 NumberFormatException)
    • getDateHeader 将获取字符串转换成date类型(转换不成功,将会抛出IllegalArgumentException)

3.5、请求路径参数

  • Request URI路径
    • Context Path (上下文路径) 以/开头
    • Servlet Path (Servlet路径) mapping确定的部分
    • PathInfo 信息 不能确定的uri部分 ,可以是null
  • 获取这些信息可以通过如下方法获取
    • getContextPath
    • getServletPath
    • getPathInfo
  • 总体来说 requestURI = contextPath + servletPath + pathInfo
  • 配置
  • Context Path /catalog
    Servlet Mapping Pattern: /lawn/* 处理uri通配符
    Servlet: LawnServlet 处理Servlet
    Servlet Mapping Pattern: /garden/*
    Servlet: GardenServlet
    Servlet Mapping Pattern: *.jsp
    Servlet: JSPServlet
    例子
  • Request Path(请求路径) Path Elements(路径元素)
    /catalog/lawn/index.html ContextPath: /catalog
    ServletPath: /lawn
    PathInfo: /index.html
    /catalog/garden/implements ContextPath: /catalog
    ServletPath: /garden
    PathInfo: /implements
    /catalog/help/feedback.jsp ContextPath: /catalog
    ServletPath: /help/feedback.jsp
    PathInfo: null

3.6、路径转换方法

  • 获取特定位置路径位置
    • ServletContext.getRealPath 真实文件路径(本地文件系统)也有可能返回null
    • HttpServletRequest.getPathTranslated 获取真实文件路径的pathInfo信息

3.7、非阻塞IO

  • 异步请求提高服务扩展能力,那么什么时候可以获取到结果,所有需要注册回调或监听器
  • ReadListener ( 读取监听器)
    • onDataAvailable() 数据读取准备好(ServletInputStream), 容器会调用这个方法
    • onAllDataRead() 数据读取完毕, (ServletRequest)
    • onError(Throwable t) 处理过程发生异常,都会调用这个方法
  • 除了ReadListener, 还有一些相关的方法添加到ServletInputStream
    • boolean isFinished() ServletInputStream 的请求数据被读取完成
    • boolean isReady() 数据是否准备好
    • void setReadListener(ReadListener listener) 只能异步使用,其它同步使用抛出IllegalStateException

3.8、Cookies

  • 客户端缓存数据,key-value
  • HttpOnly 标识cookies 暗示不希望暴露到客户端脚本使用,减少跨域攻击

3.9、SSL属性

  • 支持安全属性传输,必须暴露如下参数给servlet
  • 属性 属性名称 java类型
    cipher suite javax.servlet.request.cipher_suite String
    bit size of the algorithm javax.servlet.request.key_size Integer
    SSL session id javax.servlet.request.ssl_session_id String
    如果是证书验证的,需要属性 java.security.cert.X509Certificate

3.10、国际化

  • 使用 Accept-Language 客户接受语言
  • ServletRequest接口
    • getLocale
    • getLocales

##3.11、请求数据编码

  • 默认数据编码 是 ISO-8859-1
  • 如果没有设置数据编码,那么调用getCharacterEncoding方法返回null
  • 当然在解析数据之前需要调用setCharacterEncoding(String enc)

3.12、Request的生命周期

  • 请求对象在servlet服务期间不会被回收,比如service和doFilter(过滤)方法,如果异步的话会调用startAsync 到 complete 完成整个过程,除此之外不要在非request的scope(域)内调用startAsync,可以引起不确定结果