Servlet——Cookie和Session

首先介绍以下Servlet的请求转发和重定向。请求转发和重定向都是Servlet的跳转技术
  • 请求转发:request.getRequestDispatcher("dispatcher.jsp").forward(request,response)
  • 请求转发:request.getRequestDispatcher("dispatcher.jsp").include(request,response)
  • 重定向: response.sendRedirect("redirect.jsp")

使用请求转发,转发到其他Servlet或者页面时,可以通过request.setAttribute()request.getAttribute()来传递数据。需要注意的是,使用forward方法的时候只会将request传递下去,而使用include方法才会将request和response都传递下去。比如如下代码,只有在使用include方法的时候,才会在转发的页面当中显示hello world

//在dispatcher.jsp中不会显示hello world
request.getRequestDispatcher("dispatcher.jsp").forward(request,response);
response.getWriter().write("hello world");

//在dispatcher.jsp中会显示hello world
request.getRequestDispatcher("dispatcher.jsp").include(request,response);
response.getWriter().write("hello world");

使用重定向,转发到其他Servlet或者页面时,是真正的跳转,不再与之前的Servlet或者页面产生任何交互。
从方法的归属就可以看出,重定向是属于服务器响应的方法,而请求转发还是属于客户端的请求。
也就是说,重定向是一次请求一次响应,而请求转发是多次请求一次响应。

而怎样在使用重定向后,还能将数据传递下去呢,这时候就需要Session,在认识Session之前,需要先认识Cookie

HTTP是一个无状态的协议,当一个客户端向服务器发送完请求,服务器返回响应后,连接就关闭了,服务器端不再保留任何信息。那么当客户端发送多次请求且需要相同的请求参数时该怎么办,这时就应该使用Cookie技术。我们在页面中登陆某网站时,浏览器经常自动弹出用户名和密码,这就是使用Cookie技术后,保存在我们客户端本地的缓存信息,我们可以直接称这些信息为Cookie。
Cookie是一种在客户端保持HTTP状态信息的技术,是在浏览器访问服务器资源时,由服务器在响应头中传送给浏览器的数据。如果浏览器保存了这个Cookie,那么以后每次访问服务器时,都会在请求头中将Cookie传递给服务器。Cookie以key-value的形式记录信息。服务器可以给浏览器(就是客户端)发送多个Cookie,一个浏览器也可以存多个服务器的Cookie。

 @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("gbk");

        //创建cookie
        Cookie cookie1 = new Cookie("0000001", "beijing");
        //将cookie放到响应头中,此时cookie只保存在浏览器中,是临时cookie,浏览器一关闭cookie就被清空了
        response.addCookie(cookie1);


        Cookie cookie2 = new Cookie("1234", "shanghai");
        //使用这个方法来设置cookie在浏览器的保存时间,单位是秒,通过这种方式就可以实现一些登陆页面的x天内自动登陆的功能
        ///cookie2.setMaxAge(3*24*3600);
        //以下方法可以对cookie的保存路径有个限制,这个方法有很好的应用,比如jd的cookie不能保存到taobao的页面当中
        cookie2.setPath("/ServletLearning");
        response.addCookie(cookie2);

        //可通过request的方法获取cookie
        Cookie[] cookies = request.getCookies();
        if (cookies.length > 0) {
            for (Cookie c :
                    cookies) {
                System.out.println(c.getName() + ":" + c.getValue());
            }
        } else {
            System.out.println("当前浏览器还没有cookie,如果在没有cookie的时候尝试获取cookie,会报空指针异常");
        }
    }

读者可打开浏览器的开发者工具观察Cookie

Session

当用户的不同请求需要用到同样的数据时,这时候就需要Session了,这是一个服务器端存储数据的技术。比如登陆了淘宝后,点击商品跳转到其他页面,这是我们还保持着登陆的状态而不需要重新登录,也就是说不同的请求,而服务器端却将我们的用户名密码记住了,这就是Session技术。下面话一个图,更直观地辨析一下Cookie和Session
在这里插入图片描述
Session表示会话,指一点时间内,用户与服务器的一系列交互操作。Session对象指的是用户发送不同请求的时候,在服务器端保存不同请求的共享数据的存储对象。
Session有几个特点

  • Session技术依赖于Cookie技术
  • Session由服务器端进行创建
  • 每个用户独立拥有一个Session对象
  • 每个Session对象默认生命时长30分钟

Session机制 :用户第一次向服务端发送请求,服务端接受到请求后,调用对应的Servlet处理,在处理过程中会给用户创建一个Session对象,用来存储用户请求中的公共数据,并将此session对象的JSESSIONID以key-value的形式在响应体中返回给浏览器(临时数据,浏览器关闭即丢失)。用户再次发起请求时,请求信息中会带有JSESSIONID,服务器接受到请求后,调用对应的Servlet进行处理,同时根据JSESSIONID找到对应的Session对象进行处理。
在这里插入图片描述

/**
 * session作用:解决相同用户发送不同请求时的共享数据问题
 * @author Song X.
 * @date 2020/02/13
 */
public class SessionServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request,response);
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setCharacterEncoding("gbk");

        //获取session对象
        HttpSession session = request.getSession();
        //拿到JSESSIONID
        System.out.println(session.getId());

        //设置session的生命时长,单位是秒
       // session.setMaxInactiveInterval(3);

        //设置session强制失效,这样即使不关闭浏览器,每次请求也都是不同的JSESSIONID
       // session.invalidate();
        session.setAttribute("1", "hello world");

    }
}
public class SessionServlet2 extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        String attribute = (String)session.getAttribute("1");
        response.getWriter().write(attribute);
    }
}

先运行SessionServlet,再运行SessionServlet2,会发现数据已经在不同的请求间传递了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值