JAVAWeb - Cookie和Session

一.会话

会话:用户打开了一个浏览器,点击了很多超链接,访问了多个web资源,关闭浏览器,这个过程可以称之为会话。

有状态会话:

你怎么证明你是重工的学生?

你                                 重工

1.发票                           重工给你缴费的发票

2.学校的点名册             重工标记了你来过学校

同理:一个网站怎么证明你来过了?

客户端                                       服务端

1.服务端给客户端一个信件,客户端下次访问服务端带上信件即可:(cookie)

2.服务器登记你来过了,下次来的时候继续匹配你:(seesion)

二.保存会话的两种技术

cookie:  客户端技术(响应,请求)

seesion:服务器技术,利用这个技术,可以保存用户的会话信息,可以把数据保存在session中

常见引用:

访问网站时,第一次访问时登录以后,下次再来访问就可以不用登录了

三.Cookie

1.从请求中拿到cookie信息

2.服务器响应给客户端Cookie

//保存用户上一次访问的时间
public class CookieDome01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //服务器会记录你来的时间,把这个时间封装成为一个信件,下次访问的时候,就可以知道你上次多久来的
        //解决中文乱码
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        PrintWriter out = resp.getWriter();//输出对象,用于输出一些文字的
        //cookie 服务器从客户端获取
        Cookie[] cookies = req.getCookies();//这里返回数组,说明cookie可能存在多个
        //判断cookie 是否纯在
        if(cookies!=null){
            //如果存在,就输出上次访问的时间
            for (int i = 0; i <cookies.length ; i++) {
                Cookie cookie = cookies[i];
                //获取cookies的名字
                if(cookie.getName().equals("lastLoginTime")){
                    //获取cookies的值
                    out.write("您上一次访问的时间是:");
                    long lastLoginTime = Long.parseLong(cookie.getValue());//这一步才是获得时间的方法
                    Date date = new Date(lastLoginTime);
                    out.write(date.toLocaleString());
                }
            }
        }else{
            out.write("这是您第一次访问!");
        }
        //当用户第一次访问时候给用户发一个cookie
        Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
        cookie.setMaxAge(24*60*60);//设置cookies有效期为1天
        resp.addCookie(cookie);

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

  我们在使用cookie中所用到的方法

1.   Cookie[]    cookies =   req.getCookies();//获得cookie

2.    cookie.getName()   获得cookie  中key(名字) equals:判断两个对象的值是否相等

3.      cookie.getValue()  获得cookie中的vlaue

4.    Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");用户是第一次访问的时候这个申请的cookie是服务器发给客户端的

5.    cookie.setMaxAge(24*60*60);  设置cookie的有效期

6.   resp.addCookie(cookie);  响应客户端的cookie ,因为cookie每次都在变化,所以不管是第一次还是多次访问以后,都需要一个新的cookie

补充:

cookies:一般会保存在本地的目录下  在用户目录下的   appdata

一个网站的cookie是否存在上线?

a.一个cookie只能保存一个信息

b.一个web服务器可以向浏览器发送多个cookie,最多放置20个cookie

c.    cookie大小有限制:4KB

d.  浏览器最多可以接收300个cookie

删除cookies

a.不设置有效期,关闭浏览器,自动消失

b.设置cookie的有效期为 0

解决servlet中文乱码问题

resp.setHeader("content-type","text/html;charset=UTF-8");
 URLEncoder.encode("马明","utf-8")//编码
URLDecoder.decode(cookie.getValue(),"utf-8")//解码
Session(重点)
服务器会给每个用户(浏览器)创建一个session对象
一个session独占一个浏览器,只要浏览器没有关闭,这个session就一直存在
用户登录之后,整个网站拓展都可以访问=====保存用户信息,保存购物车信息
session和cookie的区别
cookie是把用户的数据写给用户浏览器,浏览器保存(可以保存多个)
session把用户的数据写到用户独占的session中,服务器端保存(保存重要信息,减少资源浪费)
session对象由服务器创建
常见应用
保存用户的登录信息
购物车信息
整个网站中经常会使用的数据,保存在网站中
public class SessionDemo01 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //解决中文乱码问题
        req.setCharacterEncoding("utf-8");
        resp.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charest=utf-8");
        //得到session
        HttpSession session = req.getSession();

        //给session存东西
        session.setAttribute("name",new presion("马明",19));
        //获得session的id
        String id = session.getId();
        //判断按session是不是创建成功
        if(session.isNew()){
            resp.getWriter().write("session创建成功,ID:"+id);
        }else{
            resp.getWriter().write("session已经在服务器中存在了,ID:"+id);
        }
        //session创建的时候做了什么事情
        //实际上session就是创建的一个cookie,然后带回了浏览器
        /*Cookie cookie = new Cookie("name", id);
        resp.addCookie(cookie);*/
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

session的创建步骤和cookie的差不多,只是使用的方法一个是属于cookie方法,一个是session方法

a.得到session对象    HttpSession session = req.getSession();

b.给session中存入东西   session.setAttribute()

c.获得session的id      String id = session.getId();

d.判断session是否创建成功   session.isNew()   返回的是布尔值(T  or  F)

e.   session.getAttribute()拿到session的属性:可能是字符串,也可能是对象

f.    session.removeAttribute("name");    

      session.invalidate();

手动注销session

会话自动过期:web.xml中配置
<session-config>
        <!--session自动过期,以分钟为单位-->
        <session-timeout>15</session-timeout>
    </session-config>

 

posted @ 2022-10-30 22:55  回忆也交给时间  阅读(25)  评论(0编辑  收藏  举报