HTTP协议的无状态性

无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端的请求。

但是当同一个浏览器再次发送请求给了服务器的时候,服务器并不知道它就是刚才那个浏览器。

简单地说,就是服务器不回去记得你,所以就是无状态协议。

保存用户状态的两大机制:Session和Cookie。

什么是Cookie?

Cookie:中文名称“小甜饼”,是Web服务器保存在客户端的一系列文本信息。

典型应用一:判定注册用户是否已经登录网站。

典型应用二:“购物车”的处理。

Cookie的作用:

对特定对象的追踪

保存用户网页浏览记录和习惯

简化登录

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

JSP页面中创建与使用Cookie

创建Cookie对象

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

写入Cookie对象

reponse.addCookie(newCookie);

读取Cookie对象

Cookie[] cookies = request.getCookie();

JSP中创建和使用Cookie的常用方法

方法名称

说明

void setMaxAge(int expiry)

设置cookie的有效期,以秒为单位

void setValue(String value)

在cookie创建后,对cookie进行赋值

String getName()

获取cookie的名称

String getValue()

获取cookie的值

int getMaxAge()

获取cookie的有效时间,以秒为单位

案例:实现记忆用户名和密码功能

登陆的时候会提示是否记住用户。

首先是用户的一个登陆界面login.jsp,登录界面中除了有用户名和密码,还有一个checkbox,用于提示用户是否记住用户名和密码。如果点选了这个checkbox,那么Cookie将会记住这个用户名和密码。

用户登录界面提交的表单将会传递到dologin.jsp页面中,这个页面负责Cookie相关的处理,并且将数据传递到user.jsp页面中。

这个页面需要通过login.jsp提交的表单判断checkbox是否勾选了,如果勾选了,那么我们需要设置username和password对应的cookie的生存时间为10天;如果没有勾选,则我们需要删除username和password对应的cookie。

user.jsp页面负责显示用户的用户名和密码。如果cookie保存了用户的用户名和密码,那么user.jsp页面中将会得到我的用户名和密码信息(by cookie)。

在user.jsp中我们只需要获取cookie中的信息就可以了。

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>login page</title>
</head>
<body>
<%
//request.setCharacterEncoding("utf-8");
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0)
for (Cookie cookie : cookies)
if (cookie.getName().equals("username"))
username = URLDecoder.decode(cookie.getValue(), "utf-8");
else if (cookie.getName().equals("password"))
password = URLDecoder.decode(cookie.getValue(), "utf-8");
%>
<form name="regForm" action="dologin.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="isUseCookie" value="tenDays">十天内记住用户名和密码</td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"></td>
</tr>
</table>
</form>
</body>
</html>

login.jsp

<%@page import="java.net.URLEncoder"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>do login page</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String[] isUseCookie = request.getParameterValues("isUseCookie");
if (isUseCookie != null && isUseCookie.length > 0) {
String username = URLEncoder.encode(request.getParameter("username"), "utf-8");
String password = URLEncoder.encode(request.getParameter("password"), "utf-8");
Cookie usernameCookie = new Cookie("username", username);
usernameCookie.setMaxAge(864000); // 864000 seconds == 10 days
Cookie passwordCookie = new Cookie("password", password);
passwordCookie.setMaxAge(864000);
response.addCookie(usernameCookie);
response.addCookie(passwordCookie);
}
else {
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0)
for (Cookie cookie : cookies)
if (cookie.getName().equals("username") || cookie.getName().equals("password")) {
cookie.setMaxAge(0);
response.addCookie(cookie);
}
}
request.getRequestDispatcher("user.jsp").forward(request, response);
%>
</body>
</html>

dologin.jsp

<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String username = "";
String password = "";
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0)
for (Cookie cookie : cookies)
if (cookie.getName().equals("username"))
username = URLDecoder.decode(cookie.getValue(), "utf-8");
else if (cookie.getName().equals("password"))
password = URLDecoder.decode(cookie.getValue(), "utf-8");
%>
用户名:<%=username %><br>
密码:<%=password %><br>
<a href="login.jsp">返回登录页面</a>
</body>
</html>

user.jsp

效果:

   

session与cookie的对比

Session

Cookie

在服务器端保存用户信息

在客户端保存用户信息

Session中保存的是Object类型

Cookie中保存的是String类型

随会话的结束而将其存储的数据销毁

Cookie可以长期保存在客户端

保存重要的信息

保存不重要的用户信息

JSP状态管理 及 Cookie实例的更多相关文章

  1. JSP 状态管理 -- Session 和 Cookie

    Http 协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求.但是同一个浏览器再次发送请求给服务器的时候,服务器并不知道它就是刚才那个浏览器 session sessio ...

  2. 状态管理之cookie使用及其限制、session会话

    # 1.什么是状态管理? 将浏览器与web服务器之间多次交互当作一个整体来处理,并且将多次交互所涉及的数据(即状态)保存下来.(cookie浏览器所涉及到的访问数据保存下来)# 2.如何进行状态管理? ...

  3. Redux状态管理方法与实例

    状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...

  4. jsp状态管理

    http无状态协议 服务器记不住你 每次浏览器访问,服务器不会特点保存相应信息,故记不住你 jsp状态存储的两种机制 cookie 存储在客户端 用途: 1.简化登陆 2.追踪特定对象 3.保存用户常 ...

  5. React + MobX 状态管理入门及实例

    前言 现在最热门的前端框架,毫无疑问是React. React是一个状态机,由开始的初始状态,通过与用户的互动,导致状态变化,从而重新渲染UI. 对于小型应用,引入状态管理库是"奢侈的&qu ...

  6. JSP | 基础 | JSP状态管理 | Cookie

    Cookie : 是web服务器保存在客户端的一系列文本信息. Cookie的作用: 1.对特定的对象的追踪 2. 3. JSP中创建Cookie以及使用 创建Cookie对象 写入Cookie对象 ...

  7. Java遇见HTML——JSP篇之JSP状态管理

    一.http协议的无状态 无状态性是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求.但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才的那个浏览器.简单的说,就是服务器不 ...

  8. JSP状态管理_1_Cookie

    http协议的无状态性:当浏览器发送请求飞服务器时,服务器相应客户端请求:但当同一个浏览器再次发送请求给浏览器时,服务器并不知道它就是刚才那个客户端. 保存用户状态的两大机制:Session,Cook ...

  9. JAVA遇见HTML——JSP篇(JSP状态管理)

    案例:Cookie在登录中的应用 URL编码与解码的工具类解决中文乱码的问题,这个工具类在java.net.*包里 编码:URLEncoder.encode(String s,String enc)/ ...

随机推荐

  1. 树莓派/RaspberryPi 内核源码下载

    树莓派的源码有两种下载方式:压缩包下载和git clone指令下载. 1.压缩包下载 选择对应分支,点击Github界面的 下载按钮即可,如下图: 测试发现,同样的分支,用压缩包方式下载后编译会出错, ...

  2. CSC时无法找到C:\Program Files\Microsoft SDKs\Windows\v6.0A\lib

    偶然用到CSC编译c#程序,出现如下问题: warning CS1668: “LIB 环境变量”中指定的搜索路径“C:\Program Files\Microsoft        SDKs\Wind ...

  3. Spatial Transformer Network

    https://blog.csdn.net/yaoqi_isee/article/details/72784881 Abstract: 作者说明了CNN对于输入的数据缺乏空间变换不变形(lack of ...

  4. bash的输出多行和vim的全部选择

    使用cat命令加输出符>来在bash脚本里面输出多行文本是最直观的做法. cat >out.file <<EOF start a line ... ... a line aga ...

  5. Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制

    Atitit. Java script 多重多重catch语句的实现and Javascript js 异常机制 1. 语法错误(ERROR)和运行期错误(Exception) 1 2. 错误类型判断 ...

  6. [svc]visio绘制模具

    visio2016狮子XL自定义运维模具下载: https://github.com/lannyMa/scripts/blob/master/%E7%BE%8E%E5%8C%96%E5%AE%9A%E ...

  7. 开源项目AndroidUtil-採用Fragment实现TabHost

    原文出自:方杰|http://fangjie.sinaapp.com/?p=141 转载请注明出处 学习Android也有一段时间了.感觉大部分的Android应用都有非常多类似的组件,所以就打算做了 ...

  8. 如何重设 MySQL 的 root 密码

    MySQL下创建新用户.新数据库.设定访问权限控制都需要用到root密码.万一把root密码忘了,该怎么办? 幸运地是,重设密码很容易. 安全模式重置法 基本的思路是,以安全模式启动mysql,这样不 ...

  9. 裸的lcs

    最长公共子串,裸的复杂度N^2 #include<bits/stdc++.h> using namespace std; ][]; int main() { ]; ]; scanf(&qu ...

  10. 基于jQ+CSS3页面滚动内容元素动画特效

    今天给大家分享一款基于jQ+CSS3页面滚动内容元素动画特效.这是一款基于jQuery+CSS3实现的页面滚动代码.该实例适用于适用浏览器:360.FireFox.Chrome.Safari.Oper ...