会话技术(cookie&session)

本文详细介绍了客户端会话技术Cookie和服务器端会话技术Session的工作原理、使用步骤及其实现。Cookie用于在客户端存储少量数据,而Session则在服务器端存储,能存储更多且更安全的数据。讨论了Cookie的持久化、共享、大小限制等问题,以及Session的钝化和活化机制。同时,对比了Cookie与Session的区别,强调了它们在数据存储、安全性及大小限制上的不同。
摘要由CSDN通过智能技术生成

会话技术

会话:一次中包含多次请求和响应

一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止。

功能在一次会话的范围内的多次请求间,共享数据

方式:

1.客户端会话技术:Cookie

2.服务端会话技术:Session

客户端会话技术Cookie

概念:客户端会话技术,将数据保存到客户端数据

使用步骤:

1.创建cookie对象,绑定数据

new Cookie(String name,String value)

2.发送cookie,拿到数据

Response.addCookie(Cookie cookie);

3.获取cookie,拿到数据

Cookie[ ] Request.getCookies();

实现原理:

基于响应头set-cookie和请求cookie实现

java代码实现

 实现对cookie对象的创建以及存储

@WebServlet("/cookieDemo1")
public class CookieDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     //创建cookie对象
        Cookie cookie = new Cookie("username", "admin");
        //将cookie对象存放到response中
        response.addCookie(cookie);
        Cookie cookie1 = new Cookie("age","18");
        response.addCookie(cookie1);

    }

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

实现获取cookie对象

@WebServlet("/cookieDemo2")
public class CookieDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         //获取cookie,默认情况下同一个服务器的同一个虚拟目录的cookie值是可以获取的
        Cookie[] cookies = request.getCookies();
        if(cookies!=null){
            for (Cookie cookie : cookies) {
                String name = cookie.getName();
                String value = cookie.getValue();
                System.out.println(name +":" + value);
            }
        }
    }

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

 

 查看一下运行效果

在浏览cookieDemo2时,可以获取到cookieDemo1的cookie对象。

Cookie的细节

1.一次可以不可以发送多个cookie?

可以;可以创建多个cookie对象,使用response调用多次addCookie方法发送cookie即可。

2.Cookie在浏览器中保存多长时间?

1.默认情况下,当浏览器关闭后,Cookie数据被销毁

2.持久化存储:

setMaxAge(int seconds);

                ①正数:将Cookie数据写到硬盘的文件中。持久存储。Cookie存活时间

                ②负数:默认值

                ③零:删除cookie信息

注意删除cookie,实质上对cookie的覆盖

3.Cookie能不能存中文?

可以,直接存储。

如果是Tomcat8之前,不可以直接存中文需要存储,一般采用URL编码。(特殊字符仍然不能进行正常显示)

采用方式:

URLEncoder.encode(format,"utf-8");//进行编码

URLDecoder.decode(format,"utf-8");//进行编码

4.Cookie共享问题?

假设在一个Tomcat服务器中,部署了多个Web项目,name在这些web项目中cookie能不能共享?

setPath(String path):设置cookie的获取范围。默认情况下,设置当前的虚拟目录

如果要共享,则可以将path设置为:“/”

不同的tomcat服务器共享同cookie

setDomain(String path):如果设置一级域名相同,那么多个服务之间cookie可以共享

java代码实现

/**
 * 设置cookie的生命周期以及同一台服务器的不同虚拟路径的cookie访问
 */
@WebServlet("/cookieDemo3")
public class CookieDemo3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          Cookie cookie = new Cookie("new","123");
         cookie.setMaxAge(3000); //设置cookie的最大消亡时间3000s
         cookie.setPath("/");//设置服务器下,所有资源路径都可以使用
          response.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }
}
/**
 *实现对cookie的删除
 */
@WebServlet("/cookieDemo4")
public class CookieDemo4 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie cookie = new Cookie("new", "123");
        cookie.setMaxAge(0);
        cookie.setPath("/");
        response.addCookie(cookie);
        System.out.println("byebye");
    }

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

 

cookie特点和作用

        ①Cookie存储放在客户端浏览器

        ②浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数据也有限制(20个)。

服务器端会话技术Session

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

2.步骤:

  获取HttpSession对象的方法:

        Object getAttribute(String name)

        void setAttribute(String name ,Object value)

Java代码实现

/**
 * 实现获取session参数
 */
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String name = (String) session.getAttribute("name");
        System.out.println(name);
    }

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

3.原理

服务器如何确保在一次会话范围内,多次获取的Session对象是同一个?

第一次获取Session,没有Cookie,会在内存中创建一个新的Session对象

*Session的实现依赖于Cookie的

4.细节

①当客户端关闭后,服务器不关闭,两次获取session是否为同一个?

        默认是不一致。

若期望客户关闭后,session也能相同

Cookie cookie = new cookie("JSESSIONID",session.getId())

java代码实现

/**
 * 实现设置session参数,并且实现在同一次服务器下客户每个session对象相同
 */
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       //获取session对象
        HttpSession session = request.getSession();
        //设置session参数
        session.setAttribute("name","xiaoha");
        //希望客户关闭后,session也能相同
        Cookie cookie = new  Cookie("JSESSIONID",session.getId());
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
        //打印session对象
        System.out.println(session);
    }

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

②客户端不关闭,服务器关闭后,两次获取的session是同一个?

        不是同一个,但是要确保数据不丢失

Session的钝化:

        在服务器正常关闭之前,将session对象系列化到硬盘上

Session的活化:

        在服务器启动后,将session文件转化Wie内存中的session对象即可。

③session什么时间被销毁?

        1.服务器关闭

        2.Session对象调用invalidate()

        3.Session默认失效时间30分钟

<session-config>

        <seesion-timeout>30</session-timeout>

  </session-config>

cookie与Session区别

cookie的特点:

1.cookie一般用于存取少量的不太敏感的数据

2.在不登录的情况下,完成服务器对客户端的身份识别

session的特点:

1.session用于存储一次会话的多次请求的数据,存在服务器端

2.session可以存储任意类型,任意大小的数据

总结:

1.session存储数据在服务器端,cookie在客户端

2.session没有数据大小限制,Cookie有

3.session数据安全,cookie数据不安全

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值