JavaWeb学习——Servlet学习(Cookie、Session)

JavaWeb学习——Servlet学习(Cookie、Session)

1.Cookie和Session简单理解

问题引出:我想大家都有这种经历,当我们在网页上访问一个网页时,比如博客,邮箱等一些需要登陆的网站。每当我们关闭浏览器,下次再进入该网站时我们还需要再登陆(当然有些浏览器可能会做处理,询问用户是否保存用户名和密码,这个是属于浏览器帮我们做的,不做考虑)。但是当我们登陆上去但是不关闭浏览器而去跳转到别的网站,我们再回来进入该网站时是不需要登陆的。
那么为什么会出现这种情况呢?——Cookie怎么来的?
简单的来说,当我们首次进入该网站登录时,会生成一个特殊的字符,这个特殊字符就是Cookie。那么当我们不关闭浏览器再去访问该网站时,它一看这个用户曾经来过,就不需要再登陆了。那么当我们关闭浏览器时,本次会话就结束了,会话结束时会自动将Cookie删除。
那么会话又是什么呢?
会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。也就是打开浏览器会话产生,关闭浏览器会话结束。
保存会话的两种技术:Cookie和Session

  • Cookie
    Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
  • Session
    Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。

2.Cookie学习

具体来说,cookie机制使用一种在客户端维护状态的方案。它是客户端会话状态的存储机制,他需要用户打开客户端的cookie支持。 Cookie的作用是解决HTTP协议中缺少无状态缺陷的问题。在我们Java语言中Cookie是有API的,是在javax.servlet.http.Cookie包下。我们就直接来看下Cookie类的构造和常用方法:

  • Cookie的构造方法

    • Cookie(String name, String value):实例化Cookie对象,传入参数为Cookie的名称和Cookie的值
  • Cookie的普通方法

    • public String getName():获取Cookie的名字
    • public String getValue():获取Cookie的值
    • public void setValue(String newValue):设置Cookie的值,参数为Cookie的名字
    • public void setMaxAge(int expiry):设置Cookie的最大保存时间,即cookie的有效期
    • public int getMaxAge():获取Cookie的最大有效期
    • public void setPath(String uri):设置Cookie的有效路径,设置好后的路径下资源都会带有Cookie,一般设置Cookie的有效路径为项目路径
    • public String getPath():获取Cookie的有效路径
    • public void setDomain(String pattern):设置Cookie的有效域
    • public String getDomain():获取Cookie的有效域
  • Cookie案例:测试用户是否来过

    编写测试的Servlet代码

    package com.muhan.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;
    
    
    //导入Servlet需要的Jar包,让该类继承HttpServlet类并重写doGet和doPost方法
    public class CookieTest01 extends HttpServlet {
    
    	boolean flag = false;//设置一个标记
    	
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //调用doPost方法是为了防止请求写错而导致测试失败
            // 无论是什么get还是post请求都会调用doPost方法
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
            //设置字符编码,防止中文乱码
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
    
            //检查用户的请求,检查是否有Cookie
            //通过请求对象req获取,返回值为存放着Cookie对象的数组
            Cookie[] cookies = req.getCookies();
    
            if (flag){//如果flag为true,说明用户来过
                //判断Cookie[]是否为空,如果不为空遍历Cookie数组
                if (cookies!=null){
                    for (int i = 0; i < cookies.length; i++) {
                        //取出Cookie对象
                        Cookie cookie = cookies[i];
                        //判断Cookie的名字和我们给它设置的名字是否相同(下面会给设置)
                        if (cookie.getName().equals("lastLoginTime")){
                            //如果Cookie对象的名字不为空,说明这个Cookie对象曾经来过
                            //那么就把这个Cookie的对象值响应到网页上,方便观察
                            resp.getWriter().println("上一次来的时间为:"+cookie.getValue());
    
                        }
                    }
                }
            }else {//如果flag为false,说明用户没来过
                //提示用户第一次来,并给用户分配Cookie
                resp.getWriter().println("你是第一次来,我给你分一个Cookie吧");
    
                long nowTime = System.currentTimeMillis();//获取系统当前时间
                String timeStr = String.valueOf(nowTime);//将系统当前时间转换为字符串,因为Cookie的值只能为String类型
                //给用户分配一个名为lastLoginTime,值为系统当前时间的Cookie
                Cookie cookie = new Cookie("lastLoginTime",timeStr);
    
                //最后把这个设置好的Cookie对象响应给用户
                resp.addCookie(cookie);
    
                //然后把标记改为true
                flag=true;
    
            }
    
        }
    }
    

    配置web.xml

       
           CookieTest01
           com.muhan.cookie.CookieTest01
       
           
           CookieTest01
           /cookieTest.do
       
    

    测试:
    运行Tomcat,使用360浏览器或者chrome浏览器右键审查元素
    JavaWeb学习——Servlet学习(Cookie、Session)_第1张图片
    我们发现只有两个浏览器设置的cookie,并没有我们设置的cookie。
    那么我们访问我们刚写的Servlet对应的url看看结果:
    JavaWeb学习——Servlet学习(Cookie、Session)_第2张图片
    上面的是第一次访问,那么我们再访问第二次看看:
    JavaWeb学习——Servlet学习(Cookie、Session)_第3张图片

3.Session学习

Session是一次浏览器与服务器交互的过程,称之为会话。会话就像是两个人的一次聊天一样,聊天结束会话就结束了。session会话机制是一种服务器端机制, 服务器创建session出来后,会把session的id号,以cookie的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session的id号去,服务器发现客户机浏览器带session id过来了,就会使用内存中与之对应的session为之服务。一个连接对应一个session,session可以在一个会话中传递信息。

  • 两个常用方法:

    • setAttribute(name,value):设置值
    • getAttribute(name):获取值
  • 案例:通过Session设置值/获取值

    package com.muhan.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 SessionTest extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            //设置字符编码,处理中文乱码问题
            req.setCharacterEncoding("utf-8");
            resp.setCharacterEncoding("utf-8");
    
            //通过HttpServletRequest获得session对象
            HttpSession session = req.getSession();
    
            //获取SessionID
            String id = session.getId();
            //响应到网页上
            resp.getWriter().println("SessionID:"+id);
    
    
            //用Session设置值
            String name = "张三";
            session.setAttribute("name",name);
    
            //在网页上响应一下存入的值
            resp.getWriter().println("Session设置的值为:"+name);
    
    
            //用Session取出值
            String str = (String) session.getAttribute(name);
            //响应出去
            resp.getWriter().println("Session获取到的值为:"+str);
    
    
        }
    }
    

    配置web.xml

        
            SessionTest
            com.muhan.session.SessionTest
        
            
            SessionTest
            /session.do
        
    

    结果展示:
    JavaWeb学习——Servlet学习(Cookie、Session)_第4张图片

  • Session注销

    • 方法一:通过代码注销
      session.invalidate();
      
    • 方法二:通过配置注销
      在web.xml中配置session-config,session-timeout标签里的值为几分钟后Session过期
      
      
          1
      
      

你可能感兴趣的:(JavaWeb)