小白学习Java第三十七天

今日内容

  1. Cookie
  2. Session
  3. 完善项目修改、删除
  • 会话简介

(一)概念

客户端服务器连接开始,请求和响应(多次)的整个过程都属于一次会话。客户端和服务器交流的过程,这个过程是一个持续的过程,当关闭客户端或者服务器该次会话结束。
    一次会话指的是:就好比打电话,AB打电话,接通之后,会话开始,在此期间,AB可以进行多次对话,直到挂断电话,该次会话就结束了。而浏览器访问服务器,就跟打电话一样,浏览器A给服务器发送请求,访问web程序,该次会话就已经接通,期间不管浏览器与服务器发生过多少次请求响应,都视为一次会话,直到浏览器或服务器关闭,本次会话结束。

注意:一个浏览器就相当于一部电话,使用不同的浏览器,用同一个账户访问同一个web应用,属于不同的会话

(二)作用与分类

会话的作用:跟踪客户信息,保存客户状态,共享数据等。
会话包含以下两种:
 客户端会话:Cookie
 
服务器端会话:Session

二、为什么使用会话

因为HTTP协议是无状态的,所以服务器不知道我们之前是否访问过该资源,也就是说服务器不保留任何访问痕迹,也就无法做到跟踪或区别不同用户信息的作用。

当然,最简单的解决方案就是在每一次请求里都带上用户名和密码,每次请求都要做用户身份验证。这样虽然可行,但大大加重了服务器的负担(对于每个request都需要到数据库验证),也大大降低了用户体验(每个页面都需要重新输入用户名密码,每个页面都带有登录表单)此时,就只有在服务器或客户端保存一些类似的可以代表身份的信息,所以就有了cookiesessioncookiesession用来跟踪用户的整个会话。

三、使用方式

(一)客户端会话Cookie

1、理解

    Cookie:本意是点心  小甜点  小饼干。

在计算机中,Cookie有时也用其复数形式 Cookies。类型为小型文本文件,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息。是一种特殊的缓存技术,加密后用来存储少量数据至客户端,以便下次访问时使用。

Cookie的应用场景:

判断用户是否登录过网站,如果登录过用户信息会被保存在客户端浏览器中,下次可以从Cookie中直接获取,实现自动加载用户信息功能

用来记录购物车或者记录用户使用偏好来制定推送,比如某人近期购买过某款商品,该商品信息会被记录到客户端浏览器,并根据用户喜好给用户做定向推送

2、原理

那么如何跟踪会话呢,我们需要掌握该会话的原理就清楚了:
原理:
 本质上讲,Cookie是一段文本信息。客户端请求服务器时,如果服务器需要记录用户状态,就在响应用户请求时发送一段Cookie信息。客户端浏览器保存该Cookie信息,当用户再次访问该网站时,浏览器会把Cookie做为请求信息的一部分提交给服务器。服务器检查Cookie内容,以此来判断用户状态,服务器还会对Cookie信息进行维护,必要时会对Cookie内容进行修改。

 

简而言之我们可以这么理解:

1. 当从浏览器发送请求到服务器后,servlet创建cookie,保存少量数据,发送浏览器。

2. 浏览器获得服务器发送的cookie数据,将自动的保存到浏览器端。

3. 下次访问时,浏览器将自动携带cookie数据发送给服务器,服务器可以根据cookie信息来跟踪用户身份

3、查看Cookie

1)查看浏览器Cookie的方式:在打开的浏览器地址栏前小锁图标或小i图标上单击即可看到下面显示的Cookie数量。

 

 

  1. 具体查看某个Cookie的方式:单击上面显示的Cookie数量进入以下页面,选择某一个Cookie文件,下面即可显示当前Cookie的详细信息。其中最重要是Cookie的创建时间和到期时间,一旦Cookie过期,数据就会消失。

 

  1. 查看并清除某网站Cookie数据,以淘宝网为例(taobao.com),在浏览器右上角单击三个小点图标,选择下面的“设置”。

 

通过单击设置,打开一个新页面后选择最下方的“高级”

高级---左侧的安全检查---网站设置(内容设置)---Cookie---查看所有 Cookie 和网站数据

可以全部删除,也可单个删除Cookie

 

清除Cookie的快捷方式:Ctrl + Shift + Delete,可以根据时间范围选择性的删除。

 

4、使用

1.Cookie创建
Cookie cookie = new Cookie(String key,String value);
key:表示cookie的名字
value:表示cookie中保存的数据

2.
设置有效时间,默认情况下Cookie的有效期是浏览器关闭即结束,如果希望不受浏览器关闭的影响,可以长时间保存Cookie数据,则需要设置有效时间,单位为
cookie.setMaxAge(int expiry);

说明:

  1. 默认值为 -1 :代表浏览器关闭后,也就是会话结束后,cookie就失效了,也就没有了;
    2expiry>0 :代表浏览器关闭后,cookie不会失效,仍然存在。并且会将cookie保存到硬盘中,直到设置时间过期才会被浏览器自动删除;
    3expiry=0:删除cookie。不管是之前的expiry=-1还是expiry>0,当设置expiry=0时,cookie都会被浏览器给删除。


3. 发送给浏览器,响应Cookie
response.addCookie(cookie);

4. 获取cookie
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
    for (Cookie cookie : cookies) {
        //
获取cookie的名称
        String name = cookie.getName();
        // 获取cookie的值
        String value = cookie.getValue();
        System.out.println(name+":::"+value);
     } 
}

案例

Cookie

 

Cookie

 

 

5、特点

1Cookie中只能以键值对的形式保存字符串类型的数据
2Cookie中保存的数据有大小限制,一般不超过4KB
3
Cookie是保存在客户端的,安全性较差
4Cookie默认有效期是浏览器关闭即销毁,所以如果想持久保存Cookie对象,一定要设置有效期,并且有效期时间单位是秒。

6、案例:记住密码

 

我们以学生信息管理系统中的登录功能为例,用户登录成功后,将用户信息(账号和密码)保存到Cookie中,再次登录时从Cookie中直接获取账号和密码,自动加载到文本框中,避免手动输入。

实现思路:

  1. 用户登录成功时保存用户信息到Cookie

 

  1. 在登录页面login.jsp页面中读取cookie的数据并显示在文本框中

 

 

说明:当第一次访问登录页面login.jsp时,账号和密码文本框是空的。

当使用正确的账号和密码登录成功后,关闭浏览器,再次打开登录页面login.jsp时,会自动加载账号和密码到对应的文本框,可以直接单击登录按钮进行登录。

(二)服务器会话Session

1、理解

Session是服务器提供的一个会话对象,是第二大作用域对象。创建之后这个Session是存储到服务器中的。但Session的使用需要和浏览器建立关联,这个关联与Cookie有关,其中每一个Session对象都会对应一个sessionId,这个sessionId就被存储在Cookie中。

2、原理

第一次通过浏览器请求服务器,如果需要创建一个Session来跟踪用户信息时,服务器端会先检查这个客户请求是否包含一个Session的标识(也就是SESSIONID),如果已经包含则说明之前为用户创建过Session,服务器就按它的标识SESSIONID检索使用即可。但如果不包含标识,服务器会为此用户创建一个新的Session并生成一个唯一的SESSIONID,而这个SESSIONID就是使用Cookie对象来存储,在向客服端响应时会把SESSIONID响应到客户端浏览器进行保存。这样在后续的交互过程中,浏览器每次向服务器发送请求都会携带这个存储SESSIONIDCookie,从而借用Cookie的跟踪原理完成Session的会话跟踪。

原理图如下:

 

3、使用

1.获取session对象(如果是在servlet中,需要先获取,jsp中内置对象,可以直接使用
HttpSession session = request.getSession();
2.
保存数据到session
session.setAttribute(String 绑定名, Object 绑定值);
3.
获取session数据
Object obj = session.getAttribute("绑定名");
4.
有效时间默认30分钟,可以去tomcatconfweb.xml文件查看

手动设置有效期:
session.setMaxInactiveInterval(int expiry);单位  
5. 销毁session对象
1session.invalidate();

2)非活动时间超时

3)服务器非正常关闭

4、特点

1、存储在服务器端,安全性好
2、默认超时时间为30分钟
3Session做为第二大域对象,在一个会话范围内的数据是可以共享的
4Session存储的数据可以是任意类型

5、多个页面显示用户信息案例:

登录成功时将用户对象信息保存到session域中,在其他页面显示用户名。

 

页面中取session数据显示:

 

6、案例:登录控制

实现思路:在用户登录成功时,将用户信息保存到session域中,当用户访问未经允许的页面时,先对session中的用户信息做判断,如果用户信息为空,表示未登录,则强制跳转到登录页面,否则可正常访问。

  1. 登录验证成功存session

package com.ujiuye.servlet;

import com.ujiuye.bean.Admin;
import com.ujiuye.service.AdminService;

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 javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Set;

@WebServlet("/login")
public class AdminServlet extends HttpServlet {
    private AdminService as = new AdminService();
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       //处理中文乱码问题
        resp.setContentType("text/html;charset=utf-8");
        //获取页面数据
        String uname = req.getParameter("uname");
        String pwd = req.getParameter("pwd");
        //调用service层的方法登录验证
        Admin admin = as.login(uname, pwd);
        //判断成功与否
        if(admin!=null){
            //成功
            //将用户信息保存到Cookie中
            Cookie ckUserName = new Cookie("username",admin.getUsername());
            Cookie ckPassword = new Cookie("password",admin.getPassword());
            ckUserName.setMaxAge(24*60*60);
            ckPassword.setMaxAge(24*60*60);
            resp.addCookie(ckUserName);
            resp.addCookie(ckPassword);
            //将用户信息保存到session中
            HttpSession session = req.getSession();
            session.setAttribute("admin",admin);
            resp.sendRedirect("student?method=findAllStudentByPage");
        }else{
            //失败
            resp.sendRedirect("login.jsp");
        }
    }
}

  1. 在需要验证的页面对Session数据进行判断,为了实现多个页面中的登录控制功能,将登录控制代码单独创建一个jsp页面完成:

 

  1. 在需要验证的页面中,使用include指令引用jsp验证文件

 

  1. 安全退出

在首页index.jsp添加安全退出按钮,单击按钮时请求后台servlet完成退出操作。

 

 

Servlet:

 

(三)Cookie和Session的区别

1. CookieSession都是会话技术,Cookie是运行在客户端,Session是运行在服务器端。
2. Cookie有大小限制以及浏览器存cookie的个数也有限制,Session是没有大小限制和服务器的内存大小有关。
3.Cookie只能保存字符串数据,Session可以保存任意类型数据
4. Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击。
5. Session是保存在服务器端上会存在一段时间(默认30分钟)才会消失,如果session过多会增加服务器的压力。

二者之间的联系:

sessoin依赖Cookie,sessionId保存在客户端Cookie中。

  • 完善学生管理系统项目

(一)优化显示头像

图片路径的挂载

 

 

(二)抽象BaseServlet

由于考虑到每一个Servlet中都需要重写service方法,并且service方法中的代码基本是相同的,所以考虑到进行抽取封装,这里提取出一个父类BaseServlet去继承HttpServlet,在这里实现serivce方法的重写,利用反射机制完成分发操作,具体代码如下:

public class BaseServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //乱码处理
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //根据用户请求判断执行的是什么操作
        String method = req.getParameter("method");
        //确定执行是哪个类里哪个方法
        Class<? extends BaseServlet> clazz = this.getClass();
        //获取方法对象
        Method mh = null;
        try {
            mh = clazz.getMethod(method, HttpServletRequest.class, HttpServletResponse.class);
            //执行方法
            mh.invoke(this,req,resp);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

修改学生和管理员的Servlet,将其原来的serivce方法去掉,同时继承BaseServlet:

 

 

注意:此时通过返回获取要执行的方法时必须用方法名,所以在请求Servlet传递参数时必须传递的是方法名,而不能随便传递关键字。

(三)详情查询

  1. dao

 

  1. service

 

  1. servlet

 

  1. 页面:details.jsp

<%--
  Created by IntelliJ IDEA.
  User: Administrator
  Date: 2022/1/6
  Time: 15:58
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<table border="1" width="400px" cellspacing="0" cellpadding="5" align="center">
    <caption>
        <h2>${student.sname}学员详情展示</h2>
    </caption>
    <tr>
        <th>学号</th>
        <td>${student.sid}</td>
    </tr>
    <tr>
        <th>姓名</th>
        <td>${student.sname}</td>
    </tr>
    <tr>
        <th>年龄</th>
        <td>${student.age}</td>
    </tr>
    <tr>
        <th>性别</th>
        <td>${student.sex}</td>
    </tr>
    <tr>
        <th>头像</th>
        <td>
            <img src="http://localhost:8080/pic/${student.pic}" width="40px" height="40px">
        </td>
    </tr>
    <tr>
        <th>地址</th>
        <td>${student.addr}</td>
    </tr>
</table>
<p align="center"><button οnclick="history.back()">返回</button></p>
</body>
</html>

效果图:

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值