16-cookie&session&JSP

一、cookie
  客户端会话技术,将数据保存到客户端。

1.1、cookie方法

1)创建Cookie对象,绑定数据
  new Cookie(String name, String value) 
2)发送Cookie对象
  response.addCookie(Cookie cookie) 
3)获取Cookie,拿到数据
  Cookie[] request.getCookies()


1.2、cookie原理
  服务器创建,客户端浏览器进行保存。

通过响应消息头

set-cookie : msg=hello;服务器传输到客户端浏览器。  

通过请求消息头

cookie : msg =hello;客户端浏览器传输到服务器。

IDEA自带的cookie
  Idea-35b35af8=0c115b08-11d8-4061-91ce-8077ddbcdd93

访问同一服务器都会带cookie过去。

数量限制:
  浏览器不同不同。

1.3、 cookie的细节
1、一次可以发送多个cookie
  创建多个Cookie对象,使用response调用多次addCookie方法发送cookie即可。
  20个cookie一个web应用。

2、cookie在浏览器中保存多长时间?
1)默认情况下,当浏览器关闭后,Cookie数据被销毁
2)持久化存储:
  setMaxAge(int seconds)
  正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
  负数:默认值
  零:删除cookie信息

3、cookie能不能存中文?
  在tomcat 8 之前 cookie中不能直接存储中文数据。
  对于tomcat8之前版本,在需要将中文数据转码--->一般采用URL编码(%E3)。
  tomcat一般支持对应JDK版本,支持度最高。
  在tomcat 8 之后,cookie支持中文数据。特殊字符()还是不支持,建议使用URL编码存储,URL解码解析

4、cookie共享问题?==>提升用户体验
1)假设在一个tomcat服务器中,部署了多个web项目,那么在这些web项目中cookie能不能共享?
  默认情况下cookie不能共享
  setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录
  如果要共享,则可以将path设置为"/" (只能是在同一 个tomcat服务器的不同web项目之间进行共享)

2)不同的tomcat服务器间cookie共享问题?
  setDomain(String path): 如果设置一级域名相同,那么多个服务器之间cookie可以共享.
  setDomain(".baidu.com"), 那么tieba.baidu.com和news.baidu.com中cookie可以共享。(.baidu.com)表示一级域名。

关于URL编码:
  A %41
  你好--%E4%BD%A0  %E5%A5%BD

1.4、Cookie的特点和作用
  1)cookie存储数据在客户端浏览器
  2)浏览器对于单个cookie 的大小有限制(4kb) 以及 对同一个域名下的总cookie数量也有限制(20个)。

作用:
  1)cookie一般用于存出少量的不太敏感的数据。
  2)在不登录的情况下,完成服务器对客户端的身份识别。


>JSP
1、概念
* Java Server Pages: java服务器端页面
* 可以理解为:一个特殊的页面,其中既可以指定定义html标签,又可以定义java代码
* 用于简化书写!!!

servlet服务器小程序。
一个java类要想被外界访问到必须是一个servlet。

index_jsp.java中index_jsp
继承org.apache.jasper.runtime.HttpJspBase  继承了HttpServlet
_jspService()中实现out.write等的一些方法。

2、原理
* JSP本质上就是一个Servlet

3、JSP的脚本:JSP定义Java代码的方式
1. <% 代码 %>:定义的java代码,在service方法中。service方法中可以定义什么,该脚本中就可以定义什么。
2. <%! 代码 %>:定义的java代码,在jsp转换后的java类的成员位置。
3. <%= 代码 %>:定义的java代码,会输出到页面上。输出语句中可以定义什么,该脚本中就可以定义什么。

4. JSP的内置对象
* 在jsp页面中不需要获取和创建(已经在xx_jsp.java中创建好了),可以直接使用的对象
* jsp一共有9个内置对象。
* 今天学习3个:
* request
* response
* out:字符输出流对象。可以将数据输出到页面上。和response.getWriter()类似
* response.getWriter()和out.write()的区别:
* 在tomcat服务器真正给客户端做出响应之前,会先找response缓冲区数据,再找out缓冲区数据。
* response.getWriter()(尽量不适用此方法在jsp页面上进行输出)数据输出永远在out.write()之前==>不然会影响布局。

/*
 * Generated by the Jasper component of Apache Tomcat
 * Version: Apache Tomcat/8.5.31
 * Generated at: 2018-12-04 06:47:37 UTC
 * Note: The last modified time of this file was set to
 *       the last modified time of the source file after
 *       generation to assist with modification tracking.
 */
package org.apache.jsp;

import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;

public final class index_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent,
                 org.apache.jasper.runtime.JspSourceImports {

 int i=3;   //由<%! int i=3;%>创建的局部变量
  private static final javax.servlet.jsp.JspFactory _jspxFactory =
          javax.servlet.jsp.JspFactory.getDefaultFactory();

  private static java.util.Map<java.lang.String,java.lang.Long> _jspx_dependants;

  private static final java.util.Set<java.lang.String> _jspx_imports_packages;

  private static final java.util.Set<java.lang.String> _jspx_imports_classes;

  static {
    _jspx_imports_packages = new java.util.HashSet<>();
    _jspx_imports_packages.add("javax.servlet");
    _jspx_imports_packages.add("javax.servlet.http");
    _jspx_imports_packages.add("javax.servlet.jsp");
    _jspx_imports_classes = null;
  }

  private volatile javax.el.ExpressionFactory _el_expressionfactory;
  private volatile org.apache.tomcat.InstanceManager _jsp_instancemanager;

  public java.util.Map<java.lang.String,java.lang.Long> getDependants() {
    return _jspx_dependants;
  }

  public java.util.Set<java.lang.String> getPackageImports() {
    return _jspx_imports_packages;
  }

  public java.util.Set<java.lang.String> getClassImports() {
    return _jspx_imports_classes;
  }

  public javax.el.ExpressionFactory _jsp_getExpressionFactory() {
    if (_el_expressionfactory == null) {
      synchronized (this) {
        if (_el_expressionfactory == null) {
          _el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
        }
      }
    }
    return _el_expressionfactory;
  }

  public org.apache.tomcat.InstanceManager _jsp_getInstanceManager() {
    if (_jsp_instancemanager == null) {
      synchronized (this) {
        if (_jsp_instancemanager == null) {
          _jsp_instancemanager = org.apache.jasper.runtime.InstanceManagerFactory.getInstanceManager(getServletConfig());
        }
      }
    }
    return _jsp_instancemanager;
  }

  public void _jspInit() {
  }

  public void _jspDestroy() {
  }

  public void _jspService(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response)
      throws java.io.IOException, javax.servlet.ServletException {

    final java.lang.String _jspx_method = request.getMethod();
    if (!"GET".equals(_jspx_method) && !"POST".equals(_jspx_method) && !"HEAD".equals(_jspx_method) && !javax.servlet.DispatcherType.ERROR.equals(request.getDispatcherType())) {
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, "JSPs only permit GET POST or HEAD");
      return;
    }

    final javax.servlet.jsp.PageContext pageContext;
    javax.servlet.http.HttpSession session = null;
    final javax.servlet.ServletContext application;
    final javax.servlet.ServletConfig config;
    javax.servlet.jsp.JspWriter out = null;
    final java.lang.Object page = this;
    javax.servlet.jsp.JspWriter _jspx_out = null;
    javax.servlet.jsp.PageContext _jspx_page_context = null;


    try {
      response.setContentType("text/html;charset=UTF-8");
      pageContext = _jspxFactory.getPageContext(this, request, response,
                  null, true, 8192, true);
      _jspx_page_context = pageContext;
      application = pageContext.getServletContext();
      config = pageContext.getServletConfig();
      session = pageContext.getSession();
      out = pageContext.getOut();
      _jspx_out = out;

      out.write("\n");
      out.write("\n");
      out.write("<html>\n");
      out.write("  <head>\n");
      out.write("    <title>$Title$</title>\n");
      out.write("  </head>\n");
      out.write("  <body>\n");
      out.write("  $END$\n");
      out.write("  \n");
      out.write("  <h1>hahhahaha哈哈哈</h1>\n");
      out.write("  \n");
      out.write("  ");
 System.out.println(); 
    int i=5;
  
      out.write("\n");
      out.write("  \n");
      out.write('\n');
      out.write(' ');
      out.write(' ');
      out.write("\n");
      out.write("  \n");
      out.write("  ");
      out.print( i);
      out.write("\n");
      out.write("  \n");
      out.write("  </body>\n");
      out.write("</html>\n");
    } catch (java.lang.Throwable t) {
      if (!(t instanceof javax.servlet.jsp.SkipPageException)){
        out = _jspx_out;
        if (out != null && out.getBufferSize() != 0)
          try {
            if (response.isCommitted()) {
              out.flush();
            } else {
              out.clearBuffer();
            }
          } catch (java.io.IOException e) {}
        if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
        else throw new ServletException(t);
      }
    } finally {
      _jspxFactory.releasePageContext(_jspx_page_context);
    }
  }
}

>session
1、概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession

2、session方法
1)获取HttpSession对象:
HttpSession session = request.getSession();
2)使用HttpSession对象:
Object getAttribute(String name) 
void setAttribute(String name, Object value)
void removeAttribute(String name)

3、原理

通过响应消息头Set-Cookie:JSESSIONID=7BE58E34014A5C964DFAF05E4FE1914D; Path=/day16; HttpOnly 服务器传输到客户端浏览器。 
通过请求消息头cookie : JSESSIONID=7BE58E34014A5C964DFAF05E4FE1914D;客户端浏览器传输到服务器。

4、细节
1)当客户端关闭后,服务器不关闭,两次获取session是否为同一个?
* 默认情况下。不是。
* 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存。
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(60*60);
response.addCookie(c);

2)客户端不关闭,服务器关闭后,两次获取的session是同一个吗?
* 不是同一个,但是要确保数据不丢失。tomcat自动完成以下工作
* session的钝化:
* 在服务器正常关闭之前,将session对象系列化到硬盘上
* session的活化:
* 在服务器启动后,将session文件转化为内存中的session对象即可。

3)session什么时候被销毁?
1. 服务器关闭
2. session对象调用invalidate() 。
3. session默认失效时间 30分钟
  选择性配置修改
  <session-config>
    <session-timeout>30</session-timeout>
  </session-config>

 

5、session的特点
1. session用于存储一次会话的多次请求的数据,存在服务器端
2. session可以存储任意类型,任意大小的数据

* session与Cookie的区别:
1. session存储数据在服务器端,Cookie在客户端
2. session没有数据大小限制,Cookie有
3. session数据安全,Cookie相对于不安全
4.session可以存储任意对象,cookie存储的是字符串对象。

Tomcat的work目录存储钝化的session
在IDEA中重启服务器的话。它的work目录能进行钝化。
但是重启work目录会被删除在新建。不能活化。

钝化也叫序列化(将一个对象转换为文件)。活化-反序列化
session服务器端的一个域对象。

个性化的浏览cookie中。


posted @ 2018-12-04 20:18  payn  阅读(238)  评论(0)    收藏  举报