JSP与服务器交互总结

JSP与服务器交互总结

一、发起请求

  • HTTP请求信息头

    • 格式:

      1
      2
      3
      4
      5
      6
      7
      accept	*/*
      accept-language en-us
      user-agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; InfoPath.2; MS-RTC LM 8)
      accept-encoding gzip, deflate
      host localhost:8080
      connection Keep-Alive
      cache-control no-cache
    • 说明:

      • Accept: 指定浏览器或其他客户端可以处理的MIME类型。它的值通常为 image/png 或 image/jpeg
      • Accept-Charset: 指定浏览器要使用的字符集。比如 ISO-8859-1
      • Accept-Encoding: 指定编码类型。它的值通常为 gzip 或compress
      • Accept-Language: 指定客户端首选语言,servlet会优先返回以当前语言构成的结果集,如果servlet支持这种语言的话。比如 en,en-us,ru等等
      • Authorization: 在访问受密码保护的网页时识别不同的用户
      • Connection: 表明客户端是否可以处理HTTP持久连接。持久连接允许客户端或浏览器在一个请求中获取多个文件。Keep-Alive 表示启用持久连接
      • Content-Length: 仅适用于POST请求,表示 POST 数据的字节数
      • Cookie: 返回先前发送给浏览器的cookies至服务器
      • Host: 指出原始URL中的主机名和端口号
      • If-Modified-Since: 表明只有当网页在指定的日期被修改后客户端才需要这个网页。 服务器发送304码给客户端,表示没有更新的资源
      • If-Unmodified-Since: 与If-Modified-Since相反, 只有文档在指定日期后仍未被修改过,操作才会成功
      • Referer: 标志着所引用页面的URL。比如,如果你在页面1,然后点了个链接至页面2,那么页面1的URL就会包含在浏览器请求页面2的信息头中
      • User-Agent: 用来区分不同浏览器或客户端发送的请求,并对不同类型的浏览器返回不同的内容
  • JSP请求对象request

    • 作用: 代表客户端发起的请求。
    • 封装HTTP信息头读写方法:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      Cookie[] getCookies() 返回客户端所有的Cookie的数组
      Enumeration getAttributeNames() 返回request对象的所有属性名称的集合
      Enumeration getHeaderNames() 返回所有HTTP头的名称集合
      Enumeration getParameterNames() 返回请求中所有参数的集合
      HttpSession getSession() 返回request对应的session对象,如果没有,则创建一个
      HttpSession getSession(boolean create) 返回request对应的session对象,如果没有并且参数create为true,则返回一个新的session对象
      Locale getLocale() 返回当前页的Locale对象,可以在response中设置Object getAttribute(String name) 返回名称为name的属性值,如果不存在则返回null。
      ServletInputStream getInputStream() 返回请求的输入流
      String getAuthType() 返回认证方案的名称,用来保护servlet,比如 "BASIC" 或者 "SSL" 或 null 如果 JSP没设置保护措施
      String getCharacterEncoding() 返回request的字符编码集名称
      String getContentType() 返回request主体的MIME类型,若未知则返回null
      String getContextPath() 返回request URI中指明的上下文路径
      String getHeader(String name) 返回name指定的信息头
      String getMethod() 返回此request中的HTTP方法,比如 GET,,POST,或PUT
      String getParameter(String name) 返回此request中name指定的参数,若不存在则返回null
      String getPathInfo() 返回任何额外的与此request URL相关的路径
      String getProtocol() 返回此request所使用的协议名和版本
      String getQueryString() 返回此 request URL包含的查询字符串
      String getRemoteAddr() 返回客户端的IP地址
      String getRemoteHost() 返回客户端的完整名称
      String getRemoteUser() 返回客户端通过登录认证的用户,若用户未认证则返回null
      String getRequestURI() 返回request的URI
      String getRequestedSessionId() 返回request指定的session ID
      String getServletPath() 返回所请求的servlet路径
      String[] getParameterValues(String name) 返回指定名称的参数的所有值,若不存在则返回null
      boolean isSecure() 返回request是否使用了加密通道,比如HTTPS
      int getContentLength() 返回request主体所包含的字节数,若未知的返回-1
      int getIntHeader(String name) 返回指定名称的request信息头的值
      int getServerPort() 返回服务器端口号

二、响应请求

  • HTTP响应信息:

    • 格式:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      HTTP/1.1 200 OK
      Content-Type: text/html
      Header2: ...
      ...
      HeaderN: ...
      (Blank Line)
      <!doctype ...>
      <html>
      <head>...</head>
      <body>
      ...
      </body>
    • 说明:

      • Allow: 指定服务器支持的request方法(GET,POST等等)
      • Cache-Control: 指定响应文档能够被安全缓存的情况。通常取值为 public,private 或no-cache 等等。 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类型
      • Expires: 指明啥时候过期并从缓存中移除
      • Last-Modified: 指明文档最后修改时间。客户端可以 缓存文档并且在后续的请求中提供一个 If-Modified-Since请求头
      • Location: 在300秒内,包含所有的有一个状态码的响应地址,浏览器会自动重连然后检索新文档
      • Refresh: 指明浏览器每隔多久请求更新一次页面。* Retry-After: 与503 (Service Unavailable)一起使用来告诉用户多久后请求将会得到响应
      • Set-Cookie : 指明当前页面对应的cookie
  • JSP响应对象response:

    • 作用: 代表客户端的响应。
    • 封装处理HTTP响应的读写方法:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      String encodeRedirectURL(String url) 对sendRedirect()方法使用的URL进行编码
      String encodeURL(String url) 将URL编码,回传包含Session ID的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) 添加指定名称的响应头和int值
      void flushBuffer() 将任何缓存中的内容写入客户端
      void reset() 清除任何缓存中的任何数据,包括状态码和各种响应头
      void resetBuffer() 清除基本的缓存数据,不包括响应头和状态码
      void sendError(int sc) 使用指定的状态码向客户端发送一个出错响应,然后清除缓存
      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 servlets中响应的内容的长度,此方法用来设置 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) 设置响应的状态码

三、过滤器

  • 原理: 一个过滤器就是一个Java类,它实现了javax.servlet.Filter 接口,包含以下几个方法:

    1
    2
    3
    public void doFilter (ServletRequest, ServletResponse, FilterChain) 每当 request/response要通过过滤链时容器会调用这个方法,因为客户端请求链尾的资源
    public void init(FilterConfig filterConfig) 容器调用这个方法来表明一个过滤器被安置在服务中
    public void destroy() 容器调用这个方法来表明一个过滤器正在从服务中移除
  • 作用:

    • 在请求访问后端资源时拦截它
    • 管理从服务器返回给客户端的响应
  • 部署:

    • 实现Filter接口,定义过滤器。
    • 配置 web.xml (tomcat安装路径下的conf目录)映射成url或jsp, 支持多个,按filter的顺序执行,形如:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      <filter>
      <filter-name>LogFilter</filter-name>
      <filter-class>LogFilter</filter-class>
      <init-param>
      <param-name>test-param</param-name>
      <param-value>Initialization Paramter</param-value>
      </init-param>
      </filter>
      <filter-mapping>
      <filter-name>LogFilter</filter-name>
      <url-pattern>/*</url-pattern>
      </filter-mapping>
  • 分类:
    • 认证过滤器
    • 数据压缩过滤器
    • 加密过滤器
    • 触发资源访问事件的过滤器
    • 图像转换过滤器
    • 登录和验证过滤器
    • MIME类型链过滤器
    • 令牌过滤器
    • 转换XML内容的XSL/T过滤器

四、 其他

  • Session

    • 原理: HTTP是无状态协议,服务器无法辨别请求是否来之同一个客户端,为维持客户端与服务器的会话,可用Session 存储这个用户的所有访问信息,jsp是利用servlet的HttpSession接口来实现的。
    • 部署:

      • page指令中设置session属性值:

        1
        <%@ page session="false" %>
      • 配置web.xml文件:

        1
        2
        3
        <session-config>
        <session-timeout>15</session-timeout>
        </session-config>
    • 封装读写session常用方法:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      public Object getAttribute(String name) 返回session对象中与指定名称绑定的对象,如果不存在则返回null
      public Enumeration getAttributeNames() 返回session对象中所有的对象名称
      public long getCreationTime() 返回session对象被创建的时间, 以毫秒为单位,从1970年1月1号凌晨开始算起
      public String getId() 返回session对象的ID
      public long getLastAccessedTime() 返回客户端最后访问的时间,以毫秒为单位,从1970年1月1号凌晨开始算起
      public int getMaxInactiveInterval() 返回最大时间间隔,以秒为单位,servlet 容器将会在这段时间内保持会话打开
      public void invalidate() 将session无效化,解绑任何与该session绑定的对象
      public boolean isNew( 返回是否为一个新的客户端,或者客户端是否拒绝加入session
      public void removeAttribute(String name) 移除session中指定名称的对象
      public void setAttribute(String name, Object value) 使用指定的名称和值来产生一个对象并绑定到session中
      public void setMaxInactiveInterval(int interval) 用来指定时间,以秒为单位,servlet容器将会在这段时间内保持会话有效
  • Cookies

    • 原理: 浏览器在本地机中存储用户信息以便下一次发送请求时服务能够利用该信息识别客户或做其他处理。

    • HTTP Cookie 信息头格式:

      1
      2
      3
      4
      5
      6
      HTTP/1.1 200 OK
      Date: Fri, 04 Feb 2000 21:03:38 GMT
      Server: Apache/1.3.9 (UNIX) PHP/4.0b3
      Set-Cookie: name=xyz; expires=Friday, 04-Feb-07 22:03:38 GMT; path=/; domain=tutorialspoint.com
      Connection: close
      Content-Type: text/html
  • 操作Cookies:

    • 设置:

      • 步骤:

        1
        2
        3
        4
        5
        6
        // (1)创建一个Cookie对象: 调用Cookie的构造函数,使用一个cookie名称和值做参数,它们都是字符串,名称和值中都不能包含空格或 [ ] ( ) = , " / ? @ : ;
        Cookie cookie = new Cookie("key","value");
        // (2) 设置有效期:调用setMaxAge()函数表明cookie在多长时间(以秒为单位)内有效。下面的操作将有效期设为了24小时。
        cookie.setMaxAge(60*60*24);
        // (3) 将cookie发送至HTTP响应头中:调用response.addCookie()函数来向HTTP响应头中添加cookies。
        response.addCookie(cookie);
      • 方法说明:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        public void setDomain(String pattern) 设置cookie的域名,比如w3cschool.cc
        public String getDomain() 获取cookie的域名,比如w3cschool.cc
        public void setMaxAge(int expiry) 设置cookie有效期,以秒为单位,默认有效期为当前session的存活时间
        public int getMaxAge() 获取cookie有效期,以秒为单位,默认为-1 ,表明cookie会活到浏览器关闭为止
        public String getName() 返回 cookie的名称,名称创建后将不能被修改
        public void setValue(String newValue) 设置 cookie的值
        public String getValue() 获取cookie的值
        public void setPath(String uri) 设置cookie 的路径,默认为当前页面目录下的所有URL,还有此目录下的所有子目录
        public String getPath() 获取cookie 的路径
        public void setSecure(boolean flag) 指明cookie是否要加密传输
        public void setComment(String purpose) 设置注释描述 cookie的目的。当浏览器将cookie展现给用户时,注释将会变得非常有用
        public String getComment() 返回描述cookie目的的注释,若没有则返回null
    • 读取:

      1. 调用request.getCookies()方法来获得一个javax.servlet.http.Cookie对象的数组
      2. 遍历这个数组,使用getName()方法和getValue()方法来获取每一个cookie的名称和值
    • 删除:

      1. 获取一个已经存在的cookie(request.getCookies())
      2. 将cookie的有效期设置为0(cookie.setMaxAge(0))
      3. 将这个cookie重新添加进响应头中(response.addCookie(cookie))