Servlet程序 Cookie对象 Session对象

Servlet程序

Servlet是指任何实现了这个Servlet接口的类。Servlet主要用于处理客户端传来的HTTP请求,并返回一个响应,它能够处理的请求有DoGet()和DoPost()等方法。

Servlet由Servlet容器提供,所谓的Servlet容器是指提供了Servlet功能的服务器(如Tomcat),Servlet容器将Servlet动态的加载到服务器上。与HTTP协议相关的Servlet使用HTTP请求和HTTP响应与客户端进行交互。因此,Servlet容器支持所有HTTP协议的请求和响应。Servlet应用程序的体系结构如下图所示:
在这里插入图片描述
Servlet的请求首先会被HTTP服务器接收,HTTP服务器只负责静态HTML页面的解析,对于Servlet的请求转交给Servlet容器,Servlet会根据web.xml文件中的映射关系调用相应的Servlet,Servlet将处理的结果返回给Servlet容器,并通过HTTP服务器将响应传递给客户端。
Servlet的生命周期
在这里插入图片描述
生命周期的三个阶段:(摘自《Java Web程序设计任务教程》)
1.初始化阶段
当客户端向Servlet容器发出HTTP请求要求访问Servlet时,Servlet容器首先会解析请求,检查内存是否已经有了该Servlet对象,如果有直接使用该Servlet对象,如果没有就创建Servlet实例对象,然后通过init()方法实现Servlet的初始化工作,需要注意的是,Servlet的整个生命周期内,它的init()方法只被调用一次。
2.运行阶段
这是Servlet周期中最重要的阶段,在这个阶段,Servlet容器会为这个请求创建代表HTTP请求的ServletRequest对象和代表HTTP请求的ServletResponse对象,然后将它们作为参数传递给Servlet的service()方法,service()方法从ServletRequest对象中获得用户请求信息并处理该请求,通过ServletResponse对象生成响应结果。在Servlet的整个生命周期中,对于Servlet的每一次请求访问都会调用一次Servlet的service()方法,并创建新得ServletRequest对象和ServletResponse对象,也就是说,service()方法在servlet生命周期中会被调用多次。
3.销毁阶段
当服务器关闭或Web应用被移出容器时,Servlet随着Web应用的销毁而销毁。在销毁Servlet之前,Servlet容器会调用Servlet的destory()方法,以便让Servlet对象释放他所占用的资源。

加载阶段——>实例化阶段——>初始化阶段——>服务阶段——>销毁阶段。

Cookie对象

Cookie是一种会话技术,它用于将会话过程中的数据保存在浏览器中,从而使浏览器和服务器可以更好的进行数据交互
Cookie在浏览器和服务器之间的传输过程:
在这里插入图片描述
当用户第一次访问服务器时,服务器会在响应消息中增加Set-Cookie头字段,将用户信息已Cookie的形式发送给浏览器。一旦用户浏览器接受了服务器发送的Cookie信息,就将它保存在浏览器的缓冲区中。这样,当浏览器后续访问该服务器时,都会在请求中将用户信息以Cookie的形式发送给服务器,从而使服务器端分辨出当前信息是由哪个用户发出的。
使用cookie,保存登录信息,30天内,用户无需登录:

 /***
     * 将成功登录的用户名密码存储到浏览器Cookie中
     * @param response 服务器响应对象
     * @param user 用户名
     * @param password 密码
     */
      private void setCookie(HttpServletResponse response, String user, String password) {
    
    
        // 若用户名密码正确,则将信息存储到cookie中
        Cookie cooUserName = new Cookie("user", user);
        // 将用户名密码存储30天
        cooUserName.setMaxAge(60 * 60 * 24 * 30);
        response.addCookie(cooUserName);
        
        Cookie cooPassword = new Cookie("password", password);
        cooPassword.setMaxAge(60 * 60 * 24 * 30);
        response.addCookie(cooPassword);
    }

Cookie的内容主要包括:名字,值,过期时间,路径和域。路径与域一起构成cooki的作用范围。
Cookie的生命周期
若不设置过期时间,则表示这个cookie的生命期为浏览器会话期间,关闭浏览器窗口,cookie就消失。这种生命期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间。
存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存里的cookie,不同的浏览器有不同的处理方式。

Session对象

session机制是一种将会话数据保存在服务器端的技术,当浏览器访问web服务器时,Servlet容器就会创建一个Session对象和ID属性,其中,Session对象就相当于病例档案,ID就相当于就诊卡号。当客户端后续访问服务器时,只要将标识号传递给服务器,服务器就能判断出该请求是哪个客户端发送的,从而选择与之对应的Session对象为其服务。
需要注意的是,由于客户端需要接收、记录和回送Session对象的ID,因此,通常情况下,Session是借助Cookie技术来传递ID属性的
Session保存用户信息的过程:
Session保存用户信息的过程
使用session,显示网站当前在线人数:

 /***
     * 将成功登录的用户人数存储到Session中
     * @param request 客户端请求对象
     */
      private void setSession(HttpServletRequest request) {
    
    
        String visitCountKey = new String("visitCount");
        Integer visitCount = new Integer(0);
        // 如果不存在 session 会话,则创建一个 session 对象
        HttpSession session = request.getSession(true);
        
         // 如果第一次访问,则创建新的会话
        if (session.getAttribute(visitCountKey) == null) {
    
    
            System.out.println("user: " + session.getId() + " access server at " + DatabaseOperation.getCurrentTime());
            session.setAttribute(visitCountKey, new Integer(1));
            visitCount++;
        } else {
    
    
            visitCount = (Integer) session.getAttribute(visitCountKey);
        }
        // 检查网页上是否有新的访问者
        if (session.isNew()) {
    
    
            System.out.println("user: " + session.getId() + " access server at " + DatabaseOperation.getCurrentTime());
            visitCount = (Integer) session.getAttribute(visitCountKey);
            visitCount++;
            session.setAttribute(visitCountKey, visitCount);
        }
         System.out.println("online users count: " + visitCount + " at " + DatabaseOperation.getCurrentTime());
    }

Session的生命周期:
Session何时失效
1.服务器会把长时间没有活动的Session从服务器内存中清除,此时Session便失效。Tomcat中Session的默认失效时间为20分钟。
2.调用Session的invalidate方法。

HttpSession session = request.getSession();
session.invalidate();//注销该request的所有session

3.session的过期时间是从什么时候开始计算的?是从一登录就开始计算还是说从停止活动开始计算?
答:从session不活动的时候开始计算,如果session一直活动,session就总不会过期。
从该Session未被访问,开始计时; 一旦Session被访问,计时清0;
4.设置session的失效时间
a)web.xml中

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

b)在程序中手动设置
session.setMaxInactiveInterval(30 * 60);//设置单位为秒,设置为-1永不过期

request.getSession().setMaxInactiveInterval(-1);//永不过期

c)tomcat也可以修改session过期时间,在server.xml中定义context时采用如下定义:

<Context path="/livsorder" 
docBase="/home/httpd/html/livsorder"   defaultSessionTimeOut="3600" 
isWARExpanded="true"   
isWARValidated="false" isInvokerEnabled="true"   isWorkDirPersistent="false"/>

猜你喜欢

转载自blog.csdn.net/sunshine543123/article/details/107264087
今日推荐