会话管理、拦截器

  1.  初始化时机
    1.  第一次请求

默认servlet是在第一次请求的时候,调用无参构造创建对象,并调用init方法

并且只执行一次

Load-on-startup默认 是 -1

    1.  启动tomcat的时候

     

或者是注解方式

 

启动tomcat的时候初始化

 

当我们发送请求的时候 只需要执行doGet即可

 

  1.  会话管理

通过前两天的编码,我们已经掌握了Servlet+JSP的使用,能够做到使用http请求进行前后端交互

那么这个时候我们就需要更加深入的去了解一些知识,叫会话管理技术

那么再进行会话管理技术之前,我们需要先明白 什么是HTTP的无状态协议

    1.  无状态协议

无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。即我们给服务器发送 HTTP 请求之后,服务器根据请求,会给我们发送数据过来,但是,发送完,不会记录任何信息。
HTTP 是一个无状态协议,这意味着每个请求都是独立的。
缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求“点到为止”不会造成不必要连接占用,缺点在于每次请求会传输大量重复的内容信息。
客户端与服务器进行动态交互的 Web 应用程序出现之后,HTTP 无状态的特性严重阻碍了这些应用程序的实现,毕竟交互是需要承前启后的,简单的购物车程序也要知道用户到底在之前选择了什么商品。于是,两种用于保持 HTTP 连接状态的技术就应运而生了,一个是 Cookie,而另一个则是 Session。

    1.  会话

一次会话中包含多次请求和响应。

  一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止

    1.  功能

在一次会话的范围内的多次请求间,共享数据

比如 你登陆网页版淘宝,登陆成功后,加入了一些商品到购物车中,那么这个过程中,我们只需要登陆一次就可以

因为登陆成功后的一次会话中,淘宝服务端就知道了我要把这些商品加入到哪个用户的购物车中,而不是每次加入购物车都需要重新传递用户信息

    1.  方式

1. 客户端会话技术:Cookie

2. 服务器端会话技术:Session

  1.  Cookie
    1.  概述

客户端会话技术,将数据保存到客户端

    1.  使用步骤

                 使用步骤:

                          1. 创建Cookie对象,绑定数据

                                   new Cookie(String name, String value)

                          2. 发送Cookie对象

                                   response.addCookie(Cookie cookie)

                          3. 获取Cookie,拿到数据

                             Cookie[]  request.getCookies() 

设置cookie的有效时间

setMaxAge(int seconds)

    1.  添加cookie

 

    1.  获取cookie

 

    1.  案例
      1.  需求

    1. 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。

    2. 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串

      1.  分析

    1. 可以采用Cookie来完成

    2. 在服务器中的Servlet判断是否有一个名为lastTime的cookie

        1. 有:不是第一次访问

            1. 响应数据:欢迎回来,您上次访问时间为:2018年6月10日11:50:20

            2. 写回Cookie:lastTime=2018年6月10日11:50:01

        2. 没有:是第一次访问

            1. 响应数据:您好,欢迎您首次访问

            2. 写回Cookie:lastTime=2018年6月10日11:50:01

      1.  代码

package cookie;

import java.io.IOException;

import java.io.PrintWriter;

import java.net.URLDecoder;

import java.net.URLEncoder;

import java.text.SimpleDateFormat;

import java.util.Date;

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;

@WebServlet("/cookie3")

public class CookieDemo_03 extends HttpServlet {

    @Override

    protected void doGet(HttpServletRequest request,

            HttpServletResponse response) throws ServletException, IOException {

        // 设置响应类型

        response.setContentType("text/html;charset=utf-8");

        // 时间格式化对象

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

        // 获取输出流

        PrintWriter pw = response.getWriter();

        // 1 获取cookie

        Cookie[] cs = request.getCookies();

       

        // 是否有lastTime这个cookie 默认没有

        boolean flag = false;

        // 2 判断是否有

        if (cs != null) {

            // 2.2 如果有响应cookie的value,并设置cookie时间

            for (Cookie cookie : cs) {

               // 2.2.1 获取对应cookie的value

               if ("lastTime".equals(cookie.getName())) {

                   // 设置 有这个cookie

                   flag = true;

                   // 2.2.2 响应value

                   // 解码

                   String strTime = URLDecoder.decode(cookie.getValue());

                   pw.println("欢迎回来,上次登录时间:"+strTime);

                   // 2.2.3 重新设置cookie的value

                   // 编码保存

                   cookie.setValue(URLEncoder.encode(sdf.format(new Date())));

                   cookie.setMaxAge(60 * 60 * 24 * 30);

                   response.addCookie(cookie);

                   break;

               }

            }

        }

        // 判断是否有这个cookie

        if(!flag){

            // 2.1 没有响应首次访问,并设置cookie时间

            // 创建cookie并响应

            Cookie cookie = new Cookie("lastTime", URLEncoder.encode(sdf.format(new Date())));

            cookie.setMaxAge(60 * 60 * 24 * 30);

            response.addCookie(cookie);

            pw.println("您好,欢迎首次访问~");

        }

    }

}

  1.  Session
    1.  概述

上面讲的Cookie是用于客户端的会话技术,现在我们来学习一下服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。HttpSession

    1.  使用步骤

                  1. 获取HttpSession对象:

                          HttpSession session = request.getSession();

                 2. 使用HttpSession对象:

                          Object getAttribute(String name) 

                          void setAttribute(String name, Object value)

                          void removeAttribute(String name) 

    1.  设置数据

     

    1.  获取数据

     

    1.  删除数据

 

    1.  一定时间内关闭浏览器也有有效

 

  1.  验证码
    1.  JUnit

导包JUnit4

 

    1.  案例需求

                 1. 访问带有验证码的登录页面login.jsp

                 2. 用户输入用户名,密码以及验证码。

                           如果用户名和密码输入有误,跳转登录页面,提示:用户名或密码错误

                           如果验证码输入有误,跳转登录页面,提示:验证码错误

                           如果全部输入正确,则跳转到主页success.jsp,显示:用户名,欢迎您

    1.  分析

1 编写一个生成验证码的java程序

2 页面中通过js去请求验证码程序,完成验证码的生成并保存入session中(注意每次请求都需要加上一个时间,否则容易出现缓存问题)

3 登陆的时候,把验证码和用户名、密码都传递到servlet,并在servlet中获取

4 然后获得session中的验证码,和传递的验证码进行比较,如果成功再比较用户名和密码

5 不管成功还是失败都需要把session中的验证码都删除,由页面重新生成

6 再根据登陆成功还是失败 跳转对应的页面和响应的提示

    1.  验证码

参考 Captcha 和 CheckCodeTest

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值