博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaWeb学习——Servlet学习(Cookie、Session)
阅读量:3942 次
发布时间:2019-05-24

本文共 5966 字,大约阅读时间需要 19 分钟。

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浏览器右键审查元素
    在这里插入图片描述
    我们发现只有两个浏览器设置的cookie,并没有我们设置的cookie。
    那么我们访问我们刚写的Servlet对应的url看看结果:
    在这里插入图片描述
    上面的是第一次访问,那么我们再访问第二次看看:
    在这里插入图片描述

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

    结果展示:

    在这里插入图片描述

  • Session注销

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

转载地址:http://eaiwi.baihongyu.com/

你可能感兴趣的文章
Python字符串操作集锦之字符串映射表
查看>>
Python字符串操作集锦之字符串编码解码函数
查看>>
Python字符串类型转换函数
查看>>
Python有用的命令
查看>>
Python条件语句
查看>>
Python eval()函数
查看>>
Linux rz和sz命令详解
查看>>
Python 集合set
查看>>
Codeforces Round #400 (Div. 1 + Div. 2, combined)D - The Door Problem(2-sat)
查看>>
IDEA中Struts2文件上传时404错误The origin server did not find a current representation for the target resour
查看>>
Perl/Tk 变量追踪及类线程实现
查看>>
1.嵌入式开发环境搭建--虚拟机安装(unbutu)系统
查看>>
2.嵌入式开发环境搭建--(unbutu)系统
查看>>
Linux USB驱动分析之USB2.0协议分析
查看>>
关于iwpriv :no private ioctls 的问题
查看>>
SQL Server Union等操作时解决不同数据库字符集冲突的问题
查看>>
Linq GroupJoin(二)
查看>>
递归:访问页面的控件或文件夹的下文件
查看>>
DataGridView分頁控件
查看>>
Linq 使用entity framework查询视图返回重复记录的问题(转)
查看>>