会话

(1)什么是会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话;

有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学,曾经来过,称之为有状态会话;

(2)保存会话的两种技术
1.cookie 客户端技术

服务端给客户端一个 信件,客户端下次访问服务端带上信件就可以了;

2.session 服务端技术,利用这个技术,可以保存用户的会话信息? 我们可以把信息或者数据放在Session中!

服务器登记你来过了,下次你来的时候我来匹配你;

Cookie

(1)概念
Cookie 是存储在客户机的文本文件,它们保存了大量轨迹信息。在 Servlet 技术基础上,JSP 显然能够提供对 HTTP cookie 的支持。

(2)步骤

  • 服务器脚本发送一系列 cookie 至浏览器。比如名字,年龄,ID 号码等等。
  • 浏览器在本地机中存储这些信息,以备不时之需。
  • 当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。

(3)方法举例

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

(4)使用jsp设置cookie
使用 JSP 设置 cookie 包含三个步骤:

1.创建一个 cookie 对象

Cookie cookie = new Cookie("key","value");

2.设置有效期

//调用 setMaxAge() 函数表明 cookie 在多长时间(以秒为单位)内有效。下面的操作将有效期设为了 24 小时。
cookie.setMaxAge(60*60*24);

3.将 cookie 发送至 HTTP 响应头中

//调用 response.addCookie() 函数来向 HTTP 响应头中添加 cookie。
response.addCookie(cookie);

(5)如何删除Cookie

  1. 不设置有效期,关闭浏览器自动失效
  2. 设置有效时间为0

(6)Cookie来测试用户是否来过

package com.westos.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CookieTest extends HttpServlet {

    boolean flag = false;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //解决乱码问题:
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        //检查请求的人是否带了Cookie
        //通过用户的请求,检查它是否有cookie
        Cookie[] cookies = request.getCookies();
        System.out.println("cookie:"+cookies);


        if (flag){//如果flag是真,来过
            if (cookies!=null){//你有cookie
                for (int i = 0; i < cookies.length ; i++) {
                    Cookie cookie = cookies[i];
                    if (cookie.getName().equals("lastLoginTime")){
                        response.getWriter().println("你上一次来的时间为:"+cookie.getValue());
                        System.out.println("刷新了cookie");
                    }
                }
            }
        }else { //如果flag是真,没来过
            response.getWriter().println("你是第一次来,还想要会员套餐");
            System.out.println("给该用户一个cookie");
        }

        //建立一个cookie
        Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");

        //设置cookie保存的时间 
        //cookie.setMaxAge();
        //把这个cookie发给客户端
        response.addCookie(cookie);

        //response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
        flag = true;


    }
}

Session

(1)概念

  • 服务器会给每一个用户(浏览器)创建一个Seesion对象;
  • 一个Seesion独占一个浏览器,只要浏览器没有关闭,这个Session就存在;
  • 用户登录之后,整个网站它都可以访问!–> 保存用户的信息;保存购物车的信息……
  • JSP利用servlet提供的HttpSession接口来识别一个用户,存储这个用户的所有访问信息。

(2)Session和Cookie的区别

  • Cookie是把用户的数据写给用户的浏览器,浏览器保存 (可以保存多个)
  • Session把用户的数据写到用户独占Session中,服务器端保存 (保存重要的信息,减少服务器资源的浪费)
  • Session对象由服务创建;

(3)Session的方法

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

(4)Session使用

一个连接对应一个session,session可以在一个会话中传递信息;

通过setAttribute设置值;

通过getAttribute获得 值;

由于是由服务器控制的,服务器一旦重启,信息就会丢失

package com.westos.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

public class SessionTest extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题:
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");
        //Session由服务器自动创建,如何获得session

        //HttpSession 得到的sessioin对象
        HttpSession session = req.getSession();

        //得到sessionID,一次会话,一个seesionID;
        String id = session.getId();
        resp.getWriter().println("获得的sessionId:\n"+id);


        String name = "qinjiang";
        //向session中存入一个值;
        session.setAttribute("name",name);
        resp.getWriter().println("存入信息成功:"+name);

    }
}
package com.westos.serlvet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

//获得session存入的值
public class SessionTest2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决乱码问题:
        req.setCharacterEncoding("UTF-8");
        resp.setCharacterEncoding("UTF-8");

        //获得
        HttpSession session = req.getSession();
        System.out.println("得到的SessionID:"+session.getId());


        String name = (String) session.getAttribute("name");
        resp.getWriter().println("得到的session存入的信息"+name);

        //Servlet  <  Seesion  <  WebContext

    }
}

(5)会话的注销:

方式一:

session.invalidate();//通过代码注销会话

方式二:(在web.xml进行)

<!--session-config可以设置会话自动过期,时间分钟为单位-->
<session-config>
    <session-timeout>1</session-timeout>
</session-config>