什么是SESSION?什么是COOKIE?SESSION和COOKIE有什么区别?什么场景适用于SESSION?什么场景适用于COOKIE?

1 背景介绍
网站一般都有登录功能,而且登陆后增删改查页面都会显示你的账号。

2.知识剖析
2.1登录后需要绑定到哪个对象?
我们知道Servlet里面有个对象可以向页面传值,比如request,response,config,context等一些对象。
2.2这些对象能不能满足这个业务需求呢?
首先我们来分析业务需求,在页面显示你的账号,可以清楚的知道多个请求都会显示,所以Resquest,response不行,因为它们是一个请求对应的一个生命周期。config和组件servlet是一对一的关系,而登录和查询是不同的servlet所以数据不共用,而且config没有读取变量的能力。tomcat内只有一个对象,context跟servlet是一多的关系,而每个人登录传递的账号都是code=“zhangsan”的数据,其中key值都是一样,存入context有冲突。
2.3使用COOKIE或SESSION来保存这样的数据
1)这几个对象之间的关系
前提条件是游览器跟服务器是一对多的关系(服务器也可能是多,那是大数据和云计算的方向),我们可以把游览器比作理发店的顾客,servlet可以比作理发师,而config对应的每个理发师的背包,context就可以比作理发店里公共的衣柜,而cookie可以比作顾客的钱包,session可比作理发店里会员管理系统。
假如我是顾客在理发店办了一张会员卡,首先我不可能把我的会员卡放在理发师背包里给理发管理(config),我也不可能放在衣柜里面(context)。但是我可放在我的钱包里面(cookie),或者放在会员管理系统里面(session,报我的电话号码就是会员)。所以从上关系可以看出:
cookie存在游览器器上,服务器压力小,但数据不安全(顾客可以改会员卡里面的信息)
-session存在服务器上,服务器压力大,但数据安全。
3.常见问题

1)为什么servlet里面的有些对象不能满足那个需求?
2)什么是cookie和session?

3)什么场景适用于session?什么场景适用于cookie?
4.解决方案:
通过创建cookie和session对象绑定数据然后在页面显示,从而实现业务场景。

5.编码实战

package cookie;
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;
/**
 * 登录检查,判断账号密码是否正确。想当于netctoss中的MainServlet.login()
 */
public class loginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受参数(账号或者密码)
        String code =req.getParameter("code");
        //检查账号或者密码
        //转发或者重定向
        //检查通过后,将账号存入cooike
        //每个cookie对象只能存一条数据,包括key和value,都是字符串
        Cookie c1=new Cookie("code",code);
        //声明cookie的生存时间,>0时cookie保存到客户端的硬盘上,=0时cookie被游览器删除,<0是存在内存(默认是小于0)
        c1.setMaxAge(600000);
        //设置cookie的有效路径
        c1.setPath("/cookieandsession");
        //将cookie发送给游览器,游览器接收到以后,会自动保存。
        resp.addCookie(c1);
        //在创建一个数据存中文
        Cookie c2 =new Cookie("city", URLEncoder.encode("北京","utf-8"));
        resp.addCookie(c2);
    }
}



package cookie;

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


/**
 * 模拟查询资费,想当于NETCTOSS中的mainServlet.findCost()
 */
public class FindCostSetvlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("++++++++++++++++++++");
        //模拟资费
        //获取cookie
        Cookie[] cs =req.getCookies();
        //将他们也输出给游览器
        if(cs!=null){
            resp.setContentType("text/html;charset=utf-8");
            PrintWriter out =resp.getWriter();
            for(Cookie c:cs){
                System.out.println("....."+c);
                out.println(c.getName()+":"+ URLDecoder.decode(c.getValue(),"utf-8"));
            }
            out.close();
        }

    }
    }


package session;

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 LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受账号
        String code =req.getParameter("code");
        //存入session,session是存在服务上的对象,他的内部可以存储任意类型的数据。
        HttpSession session =req.getSession();
        session.setAttribute("code",code);
        //响应时服务器会自动cookie,将session的Id通过cookie1发送给游览器。
        //Cookie c =new Cookie("JSESSIONID",session.getId());
    }
}


package session;

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;
import java.io.PrintWriter;

public class indexServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //由于本次请求游览器传入SID,服务器就根据此SID找到那个旧的session,可以从中读取之前存的数据。
        HttpSession session =req.getSession();
        String code =(String)session.getAttribute("code");
        resp.setContentType("text/html;charset=utf-8");
        PrintWriter out =resp.getWriter();
        out.println(code);
        out.close();
    }
}

注:上面分两部分,一部分是cookie的使用,一部分是session的使用(都是两部分),一些配置我没有贴出来,这里只介绍cookie和session的基本使用。
6.扩展思考:
我们在单独使用cookie的时候,保存的是明文,所以很容易被别人获取信息,怎么解决?就需要用到任务五下面的知识了,des加密。
注:本人初学java者,如有不对敬请指出,谢谢!
7.参考文献
CSDN、百度百科
8.更多讨论
7.参考文献
CSDN、百度百科
8 更多讨论
总结:
1))为什么servlet里面的有些对象不能满足那个需求?
首先我们来分析业务需求,在页面显示你的账号,可以清楚的知道多个请求都会显示,所以Resquest,response不行,因为它们是一个请求对应的一个生命周期。config和组件servlet是一对一的关系,而登录和查询是不同的servlet所以数据不共用,而且config没有读取变量的能力。tomcat内只有一个对象,context跟servlet是一多的关系,而每个人登录传递的账号都是code=“zhangsan”的数据,其中key值都是一样,存入context有冲突。
2)什么是cookie和session?
cookie存在游览器器上,服务器压力小,但数据不安全(顾客可以改会员卡里面的信息)
-session存在服务器上,服务器压力大,但数据安全。
3)什么场景适用于session?什么场景适用于cookie?
-重要数据存session
-一般数据存cookie
温馨提示:本人初学java者,如有不对敬请指出,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值