会话技术概述

2017-11-20 15:35:09

    会话技术

    从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会话技术就是记录这次会话中客户端的状态与数据的.

    会话分类

    会话技术分为Cookie和Session:

    2.Session:将数据存储到服务端,安全情相对好,增加服务器的压力.


    Cookie简介 

    数据存储在客户端本地,减少服务端的存储压力,安全性不好,客户端可以清除cookie.

    Cookie技术是将用户的数据存储到客户端的技术,我们分为两方面学习

    1.服务端怎样将一个Cookie发送到客户端

    2.服务端怎样接受客户端携带的Cookie

    Cookie的创建于发送

    服务器端向客户端发送一个Cookie

    1.创建Cookie:

    Cookie cookie = new Cookie(String cookieName,String cookieValue)

    示例:

    Cookie cookie = new Cookie("username","nosay")

    那么该cookie会以响应头的形式发送给客户端

    2.向客户端发送cookie

    response.addCookie(Cookie cookie);

package net.zixue.cookie;

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

@WebServlet(name = "CookieServlet",urlPatterns = "/cookie")
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

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

        Cookie cookie = new Cookie("username","nosay");  //值不能使用中文
        response.addCookie(cookie);
    }
}

    访问相应链接,查看已经生成了名为username的cookie

    上面我们发现,如果关闭浏览器在打开的话,发现创建的cookie已经被销毁了,如何让此cookie持久化呢?

    1.设置Cookie在客户端的持久化时间 :

    cookie.setMaxAge(int seconds):单位(秒)

    注意:如果不设置持久化时间 ,cookie会存储在浏览器的内存中,浏览器关闭,cookie信息销毁(会话级别的cookie),如果设置持久化时间.cookie信息会被持久化到浏览器的磁盘文件中

    示例:

    cookie.setMaxAge(10*60)

    设置cookie信息在浏览器的磁盘文件中存储的时间为10分钟,过期浏览器自动删除该cookie信息

    2.设置Cookie的携带路径

    cookie.setPath(String path);

    注意,:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息

    示例:

    cookie.setPath("/hello");

    代表访问hello的应用中的任何资源都携带cookie

    cookie.setPath("/hello/cookieServlet");

    代表访问hello中的cookieServlet时才携带cookie信息 


    如果我们生成了一个很大的cookie,但是只希望它在特定的页面去使用,毕竟如果全局全部带着此cookie,会影响不少的性能,这样的话,我们该如何去做呢.

    新建一个servlet,命名为GetCookieServlet,内容为:

package net.zixue.cookie;

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

@WebServlet(name = "GetCookieServlet",urlPatterns = "/getCookie")
public class GetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

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

    }
}

    

    修改CookieServlet文件,内容变更为:

package net.zixue.cookie;

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

@WebServlet(name = "CookieServlet",urlPatterns = "/cookie")
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

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

        Cookie cookie = new Cookie("username","nosay");  //值不能使用中文
        cookie.setMaxAge(60*10);
        cookie.setPath("/getCookie");
        response.addCookie(cookie);
    }
}

    此时清除cookie先访问CookieServlet,后发现只有访问getCookie会携带相应的cookie,测试成功.

    3.向客户端发送cookie:

    response.addCookie(Cookie cookie);

    4.删除客户端的cookie

    如果想删除客户端的已经存储的cookie信息,那么就使用同名同路径的持久化时间为0的cookie进行覆盖即可.

    也就是说只要把

cookie.setMaxAge(60*10);

    设置为0即可.

    服务端怎么接收客户端携带的Cookie

    cookie信息是以请求头的方式发送到服务器端的:

    1.通过request获得所有的Cookie:

    Cookie[] cookies = request.getCookies();

    2.遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie

    for(Cookie cookie:cookies){

        if(cookie.getName().equal(cookieName)){

            String cookieValue = cookie.getValue();

        }

    }


    相关代码如下

    CookieServlet:

package net.zixue.cookie;

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

@WebServlet(name = "CookieServlet",urlPatterns = "/cookie")
public class CookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

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

        Cookie cookie = new Cookie("username","nosay");  //值不能使用中文
        cookie.setMaxAge(60*10);
        cookie.setPath("/getCookie");

        Cookie cookie1 = new Cookie("age","18");
        cookie1.setMaxAge(60*10);
        cookie1.setPath("/getCookie");

        response.addCookie(cookie);
        response.addCookie(cookie1);
    }
}

    getCookieServlet

package net.zixue.cookie;

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

@WebServlet(name = "GetCookieServlet",urlPatterns = "/getCookie")
public class GetCookieServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }

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

        Cookie[] cookies = request.getCookies();
        for (Cookie cookie : cookies) {
            String name = cookie.getName();
            if(name.equals("age"))
            {
                String cookieValue = cookie.getValue();
                response.getWriter().write("age:" + cookieValue);
            }
        }

    }
}

    测试成功打印出我们想要的age信息.