JSP状态管理

1. http协议的无状态性

超文本传输协议(http)存在一个先天的不足,你啊就是http的无状态性。
无状态性指的是当同一个浏览器多次给服务器发送请求的时候,服务器会做出响应,但是,服务器不会知道是一个浏览器发送了这写请求。这就是http洗衣的无状态性。
因为协议的无状态性,所以服务器是记不住用户的状态的。

JSP中有保存用户的两大机制:
* Session
* Cookie

2.1 Cookie概述

Cookit的中文意思叫做“小甜饼”,是Web服务器保存在客户端的一系列文本信息
Cookie的典型用法:
* 判定注册用户是否已经登录网站
* “购物车”的处理,即保存用户添加到购物车中的信息

2.2 Cookie的作用

  • 对特定对象的跟踪
  • 保存用户网页浏览记录与习惯
    简化登录

安全风险:容易泄漏用户的信息

2.3 JSP中创建和使用Cookie

创建Cookie对象:

Cookie newCookie =new Cookie(String key,Object value);

写入Cookie对象

respose.addCookie(newCookie);

读取Cookie

Cookie[] cookies=request.getCookies();

2.4 Cookie对象的常用方法

方法名称说明
void setMaxAge(int expiry)设置Cookie的有效期
void setValue(String value)在cookie创建后对cookie进行赋值
String getName()获取cookie的名称
String getValue()获取Cookie的值
int getMaxAge()获取Cookie的有效时间(秒)

2.5 Cookie在登录中的应用

Cookie在登录中用于保存用户的登录信息(例如账号和密码)

(1) logon.jsp页面的主要代码

登录页构建了一个提交用户信息的表单,action的属性值定义为doLogin_cookie.jsp,将业务逻辑的操作交给doLogin_cookie.jsp页面来操作。

<%
    String userName="";
    String passWord="";
    Cookie [] cookie=request.getCookies();  //获取Cookie

    if(cookie!=null&&cookie.length>0) {
        for(Cookie c: cookie) {
            if(c.getName().equals("userName")) {
                userName=URLDecoder.decode(c.getValue(),"utf-8");  //采用utf-8的字符集解码cookie
            }
            if(c.getName().equals("passWord")) {

                passWord=URLDecoder.decode(c.getValue(),"utf-8");
            }
        }
    }
%>
<h2>登录页面</h2>
<form action="doLogin_cookie.jsp" method="post">
    <table>
        <tr>
            <td>用户名:</td>
            <td><input type="text" name="userName" value="<%=userName %>" /></td>
        </tr>
        <tr>
            <td>密码:</td>
            <td><input type="password" name="passWord" value="<%=passWord %>" /></td>
        </tr>
        <tr>
            <td colspan="2"><input type="checkbox" name="userCookie" checked="checked" />
            是否在十天之内保存用户信息
            </td>
        </tr>
        <tr>
            <td><input type="submit" name="submit" value="登录" /></td>
        </tr>
    </table>
</form>
(2) doLogin_cookie.jsp页面的主要代码

doLogin_cookie.jsp页面接收登录页(login.jsp)页面提交的参数。执行下列代码,保存Cookie或不保存Cookie。最后定义一个a标签,连接到user。jsp页面。验证Cookie是否保存

<% 
    request.setCharacterEncoding("utf-8");
    String userName="";
    String passWord="";
    String [] userCookie=request.getParameterValues("userCookie");
    //判断用户是否保存用户Cookie
     if(userCookie!=null&&userCookie.length>0) {

        userName=URLEncoder.encode(request.getParameter("userName"),"utf-8");  //编码cookie的字符集为utf-8
        passWord=URLEncoder.encode(request.getParameter("passWord"),"utf-8");

        Cookie  userNameCookie=new Cookie("userName",userName); //创建用户名的Cookie对象
        Cookie  passwordCookie =new Cookie("passWord",passWord); //创建用户密码的Cookie对象

        response.addCookie(userNameCookie);
        response.addCookie(passwordCookie);

        userNameCookie.setMaxAge(864000);   //设置Cookie的有效期为10天
        passwordCookie.setMaxAge(864000);   
    }
    else {

        Cookie [] cookie =request.getCookies(); //获取Cookie对象
        if(cookie!=null&&cookie.length>0) {
            for(Cookie c: cookie) {
                if(c.getName().equals("userName")||c.getName().equals("passWord")) {
                    c.setMaxAge(0);          //设置Cookie的生命周期为0(删除Cookie)
                    response.addCookie(c);   //设置之后要重新保存,否则无法生效
                }
            }
        }
    }
%>
<a href="users.jsp">显示用户的详细信息</a>
(3) user.jsp页面

user.jsp 页面验证cookie时候可以保存,若cookie已经保存则会显示用户名和密码。如果cookie没有保存,则用户名和密码为空:

<% 
    String userName="";
    String passWord="";
    Cookie [] cookie=request.getCookies();
    if(cookie!=null&&cookie.length>0) {
        for(Cookie c: cookie) {
            if(c.getName().equals("userName")) {
                userName=URLDecoder.decode(c.getValue(),"utf-8");
            }
            if(c.getName().equals("passWord")) {
                passWord=URLDecoder.decode(c.getValue(),"utf-8");
            }
        }
    }
%>
<h1>验证Cookie是否保存的页面</h1>
用户名:<%=userName %><br>
密码:<%=passWord %><br>

Tips:Cookie其实是一段纯文本文件,它的值是ASCII,所以是无法保存中文的,解决的办法就是在存储和提起Cookie的值的时候以字符集”utf-8”进行解码和编码 如下:

//编码
String userName=URLEncoder.encode(request.getParameter("userName"),"utf-8");  
//解码
String userName=URLDecoder.decode(c.getValue(),"utf-8");

2.6 Session 和Cookie对比

SessionCookie
用来保存用户信息用来保存用户信息
保存的内容是Object类型的数据保存的是String类型的数据
Session随会话的结束而在存储中被销毁Cookie可以长期保存
Session保存的是重要的信息Cookie保存的是不重要的信息

Tips:

从安全性考虑,Session的安全性比Cookie要高

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值