详解Cookie和BaseServlet

会话控制和BaseServlet

1. 会话控制
1.1 什么是会话控制
会话 ==> 聊天

服务器和客户端之间的请求和响应过程,使用会话控制技术,保存一些必要的数据,从而满足一些特定的功能

一台PC在登陆百度网站之后,不管是IP地址变更,还是关闭电脑重启之后,再一次打开百度网站,都是登陆状态。但是如果长时间没有打开百度,这里需要重新验证登陆信息。

有效时间范围以内的自动登陆就是利用会话控制技术来完成的!!!
Cookie和Session
1.2 Cookie技术
1.2.1 Cookie介绍
浏览器行为,浏览器保存服务器给予客户端数据的一种方式
	1. Cookie数据都是键值对形式,并且保存的数据都是字符串
	2. Cookie数据不能保存中文
	3. Cookie数据有大小限制,一般在4KB ~ 8KB
	4. Cookie数据会根据浏览器内核不同,支持的Cookie数量是不同的
	5. Cookie数据会根据访问不同的网络资源,自行选择对应的Cookie发送给服务器

Cookie技术用的方法
	构造方法:
		Cookie(); 在服务器端创建一个Cookie
	成员方法:
		setValue(String value);
		setMaxAge(int sec);
		setPath(String url);
	服务器需要发送Cookie数据给予浏览器保存
		通过HttpServletResponse对象调用addCookie(Cookie cookie)

【注意】
	Cookie数据中不支持空格
		会出现500错误
		Invalid Character [32] ==> space
1.2.2 Cookie的有效时间设置
整数表示当前Cookie在浏览器本地保存数据的时间,已秒为单位
cookie.setMaxAge(20);

当前浏览器打开状态下有效,如果浏览器关闭,cookie信息立即销毁
cookie.setMaxAge(-1);

销毁对应name的Cookie信息
cookie.setMaxAge(0);
1.2.3 Cookie的路径约束
当前Cookie有效范围是整个Tomcat服务器
cookie.setPath("/");

默认是当前Servlet对应URL路径Cookie有效
【缺省】cookie.setPath("/Day32_SL");

可以设置指定路径,指定资源下使用对应的Cookie信息,超出范围无法使用
cookie.setPath("/Day32_SL/user");
1.2.4 获取Cookie数据
通过HttpServletRequest对象获取Cookie数据
	Cookie[] cookies = request.getCookies();
	getName();
	getValue();
1.2.5 利用Cookie保存用户上一次登陆时间
资源:
	@WebServlet("/lastTime")
	
如何确定用户是第一次访问?
	因为用户第一次登陆,没有保存上一次登陆是的Cookie信息,假定Cookie name 为lastTime,如果没有对应的lastTime,等于说用户是第一次登陆
	
用户第一次的登陆
	创建Cookie,存入本次登陆的时间,返回给浏览器

用户非第一次登陆
	读取Cookie信息,发送Cookie中保存的上一次登陆时间,给用户展示,并且保留本次登陆时间
package com.qfedu.a_cookie;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

@WebServlet("/lastTime")
public class LastTimeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 1. 获取Cookie数据
        Cookie[] cookies = req.getCookies();
        Cookie last = null;
        String msg = null;

        // 2. 验证Cookie数组中是否存在一个Cookie name属性为lastTime的Cookie信息
        boolean flag = true;

        // 利用循环遍历Cookie数组
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if ("lastTime".equals(cookie.getName())) {
                    flag = false;
                    last = cookie;
                    break;
                }
            }
        }

        if (flag) {
            // 第一次登陆
            msg = "<h1>感谢您在茫茫网海访问本网站</h1>";
        } else {
            // 非第一次登陆
            msg = "<h1>您上一次登陆时间 " + last.getValue() + "</h1>";
        }

        Cookie lastTime = new Cookie("lastTime", new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss").format(new Date()));
        resp.addCookie(lastTime);
        resp.setContentType("text/html;charset=utf-8");
        resp.getWriter().append(msg);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
1.3 Session技术
1.3.1 Session介绍
Session是服务器技术,数据是保存在服务器端。
可以解决浏览器保存Cookie遇到的问题,例如: 中文支持,数据量大小,数据个数...

【注意】
	Session是依赖于Cookie来完成的!!!
	如果浏览器关闭了Cookie功能,会导致Session功能无法使用【非绝对】
	
	可以利用URL参数来解决Session信息验证问题,但是非常麻烦!
	
Session可以保留浏览器和服务器直接的交互数据,同时Session也是一个域对象!!
	1. 一个Session对象可以存储多个键值对信息,并且支持任意类型,包括中文字符串
	2. Session没有严格的大小限制
	3. Session是保留在服务器端,从理论角度分析,只要硬盘足够大,存什么都行,数量不限制
	4. 每一个浏览器请求会对应一个Session对象,如果需要在之后的请求中想要继续获取Session,需要保存一个核心的Cookie信息 JSESSIONID UUID
1.3.2 Session方法总结
通过HttpServletRequest对象获取Session对象
	HttpSession session = getSession(boolean create);
	如果传入false,要求必须验证Cookie名字为JSESSIONID 的cookie,如果没有Cookie或者Cookie存储的JSESSIONID 服务器端不存在,返回值为null,无对应Session,反之返回对应Session对象
	如果传入是true,首先通过Cookie获取对应验证Session,如果没有获取到对应Session,创建新Session,并且生成一个新的SessionID
	
	String getId();
	获取Session对象的ID号,在当前服务器中具有唯一性
	
	setInactiveInterval(int sec);
	设置Session对象的有效时间,所谓有效时间,是从用户请求时间开始计算,如果在有效时间内用户重新发送了带有对应SessionID Cookie的请求,有效时间从新计算,如果设置0或者负数,有效时间为永久
	
	invalidate();
	在服务器端销毁Session对象
	
	Session也是一个域对象
	存在setAttribute,getAttribute,removeAttribute方法
1.3.3 使用Session和Cookie完成自动登录

在这里插入图片描述

2.BaseServlet
2.1 Servlet冗余问题
每一个功能对应一个Servlet程序,对于Tomcat服务器而言是压力极大!!!
2.2 使用一个Servlet程序, 借助于if -else整合方法
2.3 BaseServlet代码实现
package util;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String method = req.getParameter("method");

        try {
            /*
            this表示当前Servlet程序,ActionServlet
            getMethod通过反射获取到用于指定method 名字对应的方法,方法的参数都是
            HttpServletRequest和HttpServletResponse

            invoke执行,执行方法的对象是当前ActionServlet对象
            参数也是当前Service方法内,用户提交的Request对象,以及Tomcat服务器
            对应的Response
             */
            this.getClass().
                    getMethod(method, HttpServletRequest.class, HttpServletResponse.class).
                    invoke(this, req, resp);
        } catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
            e.printStackTrace();
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值