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,会发现数据已经在不同的请求间传递了

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20600.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论