Cookie和Session学习,技术解决不同请求发送之间的数据共享问题

Cookie学习:

对于浏览器和服务器的交互模式,以及请求的处理都有了理解,并且也能够进行请求的处理。围绕整个流程再次进行技术优化,重点学习 Cookie 技术,此技术的应用面是非常广的。

问题:

HTTP是无状态,无连接的,在一次请求结束后,相关数据会被销毁。那么第二次请求需要使用相同的数据要怎么办呢?

使用cookie技术在浏览器端存储信息
在这里插入图片描述解释:
Cookie 技术其实是浏览器端的数据存储技术,解决了同一个工程下不同请求
需要使用相同的请求数据的问题。我们把请求需要共享的请求数据,存储在浏览器端,避免用户进行重复的书写请求数据。但是哪些数据需要使用 Cookie 技术存储起来是一个主观问题,需要在后台进行响应的时候来告诉浏览器,有些数据其他请求还会使用

作用:Cookie 技术解决不同请求发送之间的数据共享问题。

登陆页面,重定向

package com.serlvet;

import com.pojo.User;
import com.service.UserServieImpl;

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;
import java.net.URLEncoder;

public class LoginServlet extends HttpServlet {
    UserServieImpl usi;
    public LoginServlet(){
        usi = new UserServieImpl();
    }
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String uname =req.getParameter("uname");
        String pwd =req.getParameter("pwd");
        //调用service
        User user = usi.login(uname,pwd);
        if(user != null){
            System.out.println("登录了");
            //创建Cookie对象
//            Cookie c = new Cookie("user", user.getUname());
            //旧版本web中cookie是中文的时候要进行url传输编码处理URLEncoder.encode(user.getUname(),"utf-8")
            Cookie c = new Cookie("user", URLEncoder.encode(user.getUname(),"utf-8"));
            Cookie c2 = new Cookie("pwd",user.getPwd());
            //重定向,跳转页面
            resp.addCookie(c);//把Cookie对象放入resp对象,响应到浏览器
            resp.addCookie(c2);//把Cookie对象放入resp对象,响应到浏览器
            resp.sendRedirect("Success");
        }else{
            resp.getWriter().write("<font color='red'>用户或密码有误!</font>");
        }
    }
}


Cookie工作原理:用于解决不同请求之间的数据共享

  1. 浏览器端第一次返送请求到服务器
  2. 服务器端创建cookie,包含用户信息,将cookie发送到浏览器端
  3. 浏览器再次访问服务器时携带数据cookie
  4. 服务器通过cookie携带的数据来区分用户

重定向页面,检验cookie数据来区分用户

package com.serlvet;

import com.pojo.User;

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;
import java.net.URLDecoder;

public class Success extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        resp.setContentType("text/html;charset=utf-8");
        Cookie[] cookies = req.getCookies();
        String value =null;
        String pwd =null;
        for(Cookie c:cookies){
            if(c.getName().equals("user")){
//                value =  c.getValue();
                //解码url传输的数据
                value = URLDecoder.decode(c.getValue(),"utf-8");
            }
            if(c.getName().equals("pwd")){
                pwd = c.getValue();
            }
        }
        resp.getWriter().write("欢迎"+value+"登录,XX管理系统");
        resp.getWriter().write(pwd);
    }
}

Cookie 数据存储:

临时存储:

不设置 cookie 信息的存储时间,周期为一次会话,存储在浏览器的运行内存中,关闭浏览器即失效了
默认是临时存储:默认cookie存储之后,每次请求都会附带,除非设置有效路径
cookie设置请求路径:

 Cookie c = new Cookie("user", URLEncoder.encode(user.getUname(),"utf-8"));
            Cookie c2 = new Cookie("pwd",user.getPwd());
            c2.setPath("/SecondWeb/Success");//设置携带cookie请求的路径,就会仅仅在访问设置的路径才携带此cookie
			c1.setPath("/SecondWeb/Success");
定时存储:

设置存储时间,周期为时间设置,存储在用户电脑硬盘中。在有效期内符合路径要求的请求都会附带该信息。

c1.setMaxAge(10);//给Cookie c2设置有效时间,单位是秒
c2.setMaxAge(10);//给Cookie c2设置有效时间,单位是秒

Servlet的注解配置uri

@WebServlet(name = "MyServlet",urlPatterns = "/MyServlet")  

等同于web.xml中的以下配置:

<servlet>
        <servlet-name>MyServlet</servlet-name>
        <servlet-class>com.serlvet.MyServlet</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>MyServlet</servlet-name>
        <url-pattern>/MyServlet</url-pattern>
</servlet-mapping>

Cookie中存储中文的问题

一般来说用Cookie来保存信息的时候是不能带有中文的,但是有时候必须要用到中文的时候该怎么办呢?
注意 当Cookie里面要存中文字符的时候也需要设置编码格式
存:

  Cookie c = new Cookie("uname",URLEncoder.encode(u.getName(), "utf-8"));

取:

String name = URLDecoder.decode(c[0].getValue(), "UTF-8");

存的时候按照编码格式存
URLEncoder.encode(name,“UTF-8”)
取的时候照样要设置编码格式
URLDecoder.decode(name,“UTF-8”)才能转换成中文字符

Session学习:

Cookie 解决了发送不同请求的数据共享问题。Cookie 是浏览器端的数据存储技术,而session 则是服务器端的存储技术。

使用session技术在浏览器端存储信息
在这里插入图片描述
用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象(一但创建,就会有一个 JSESSIONID),用来存储用户请求处理相关的公共数据,并将
此 session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象(解析 JSESSIONID并通过 JSESSIONID找对应Session的是服务器底层来完成)。

特点: Session 技术是依赖 Cookie 技术的服务器端的数据存储技术。
  1. 由服务器进行创建
  2. 每个用户独立拥有一个 session 存储和获取数据
存储:session.setAttribute(String name,Object value);
获取:session.getAttribute(String name) 返回的数据类型为Object
   注意:
	存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
	使用时机:
	一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
	默认存储时间为 30 分钟

作用:
解决了一个用户的不同请求的数据共享问题。
注意:
只要不关闭浏览器,并且 session 不失效的情况下,同一个用户的任意请求在项目的任意 Servlet 中获取到的都是同一个 session对象
作用域:一次会话(一个工程内的不同请求,到关闭浏览器)

session登陆页面

package com.servlet;

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

@javax.servlet.annotation.WebServlet(name = "ServletA",urlPatterns = "/ServletA")
public class ServletA extends javax.servlet.http.HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        String a = req.getParameter("a");
        String b = req.getParameter("b");
        //创建Session对象
        HttpSession session = req.getSession(); //如果服务器中没有sesssion就创建一个新的session,如果有,就获取已经存在的session
        //把a的值放入session
        session.setAttribute("a",a);
        session.setAttribute("b",b);
    }
}

重定向页面,用来区分不同用户

package com.servlet;

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 javax.servlet.http.HttpSession;
import java.io.IOException;

@WebServlet(name = "ServletB",urlPatterns = "/ServletB")
public class ServletB extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获取session对象
        HttpSession session = req.getSession();
        String a = (String)session.getAttribute("a");
        String b = (String)session.getAttribute("b");
        resp.getWriter().println("通过session取到a的值:"+a);
        resp.getWriter().println("通过session取到b的值:"+b);
    }
}
设置存储时间
session.setMaxInactiveInterval(int seconds);//单位是秒
销毁session对象
session.invalidate();

总结:

Cookie储存在浏览器端,保存的是字符串,cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的
Session
存储在服务器端,保存的是对象,Session依赖Cookie,session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客户
上下文:也叫做“公共区域”,也就是同一个WEB应用程序(项目)中,所有的Servlet和JSP都可以共享同一个区域

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值