JavaEE-8-会话跟踪技术Cookie&Session

一、Cookie

整理自:https://www.cnblogs.com/xdp-gacl/p/3803033.html


Web应用程序是使用HTTP协议传输数据,但是HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这里我们就要用到Cookie和Session技术。

  • Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。

原理

  • Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息。

举个例子:当用户使用浏览器访问一个支持Cookie的网站的时候,用户会提供包括用户名在内的个人信息并且提交至服务器;接着,服务器在向客户端回传相应的超文本的同时也会发回这些个人信息,这些信息存放于HTTP响应头(Response Header)中。

当客户端浏览器接收到来自服务器的响应之后,浏览器会将这些信息存放在一个统一的位置,对于Windows操作系统而言,我们可以从: [系统盘]:\Documents and Settings[用户名]\Cookies目录中找到存储的Cookie;

客户端再向服务器发送请求的时候,都会把相应的Cookie再次发回至服务器。Cookie信息此时存放在HTTP请求头(Request Header)

好处:服务器在接收到来自客户端浏览器的请求之后,就能够通过分析存放于请求头的Cookie得到客户端特有的信息,从而动态生成与该客户端相对应的内容。

我们可以从很多网站的登录界面中看到“请记住我”这样的选项,如果你勾选了它之后再登录,那么在下一次访问该网站的时候就不需要进行重复而繁琐的登录动作了,而这个功能就是通过Cookie实现的。

应用一、使用cookie记录用户上一次访问的时间

public class CookieDemo01 extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置服务器端以UTF-8编码进行输出
        response.setCharacterEncoding("UTF-8");
        //设置浏览器以UTF-8编码进行接收,解决中文乱码问题
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        //获取浏览器访问访问服务器时传递过来的cookie数组
        Cookie[] cookies = request.getCookies();
        //如果用户是第一次访问,那么得到的cookies将是null
        if (cookies!=null) {
            out.write("您上次访问的时间是:");
            for (int i = 0; i < cookies.length; i++) {
                Cookie cookie = cookies[i];
                if (cookie.getName().equals("lastAccessTime")) {
                    Long lastAccessTime =Long.parseLong(cookie.getValue());
                    Date date = new Date(lastAccessTime);
                    out.write(date.toLocaleString());
                }
            }
        }else {
            out.write("这是您第一次访问本站!");
        }
        
        //用户访问过之后重新设置用户的访问时间,存储到cookie中,然后发送到客户端浏览器
        Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");//创建一个cookie,cookie的名字是lastAccessTime
        //将cookie对象添加到response对象中,这样服务器在输出response对象中的内容时就会把cookie也输出到客户端浏览器
        response.addCookie(cookie);
    }

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

}

其他的几个注意点:

  • 一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。这个有点像是键值对。
  • 一个WEB站点(即服务器)可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。

应用二、删除Cookie

//创建一个名字为lastAccessTime的cookie
Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+"");
//将cookie的有效期设置为0,命令浏览器删除该cookie
cookie.setMaxAge(0);
response.addCookie(cookie);

注意这里要删除的Cookie的new Cookie("lastAccessTime", System.currentTimeMillis()+"");的第一个参数的值要和你要删除的Cookie的值相同!!

应用三、cookie中存取中文

存取要进行中文转码:

Cookie cookie = new Cookie("userName", URLEncoder.encode("孤傲苍狼", "UTF-8"));
response.addCookie(cookie);

读取要进行中文解码:

URLDecoder.decode(cookies[i].getValue(), "UTF-8");

二、Session

整理自:https://www.cnblogs.com/xdp-gacl/p/3855702.html


  • Cookie是把用户的数据写给用户的浏览器,就是说Cookie是保存在本地的文本文件中。
  • Session技术把用户的数据写到用户独占的session中。

Session原理

服务器创建session出来后,会把session的id号以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。

创建Session的过程:

//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//将数据存储到session中
session.setAttribute("data", "孤傲苍狼");
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
       response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
       response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
}

Session的创建于销毁

创建:

//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
    response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
    response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);
}
  • 可以用isNew()方法来判断Session是不是新创建的

销毁:
session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间,例如:



  
  
  
    index.jsp
  

  
    
        15
    


手动设置Session失效:

HttpSession session = request.getSession();
//手工调用session.invalidate方法,摧毁session
session.invalidate();

Session的属性进行操作:
1、public void setAttribute(String name,String value):设定指定名字的属性的值,并将它添加到session会话范围内,如果这个属性在会话范围内存在,则更改该属性的值。
2、public Object getAttribute(String name):在会话范围内获取指定名字的属性的值,返回值类型为object,如果该属性不存在,则返回null。
3、public void removeAttribute(String name):删除指定名字的session属性,若该属性不存在,则出现异常

三、三大域对象(Session\ServletContext\Request)解析

JavaEE-8-会话跟踪技术Cookie&Session_第1张图片
图示说明

你可能感兴趣的:(JavaEE-8-会话跟踪技术Cookie&Session)