jsp04状态管理
1.http 协议的无状态性
无状态是指,当浏览器发送请求给服务器的时候,服务器会响应。但当同一个浏览器再次发送请求时,服务器不会知道是刚才那个浏览器。
简单说,服务器【不会保存用户状态】,不会记得客户端是否访问过,所以这就是无状态协议
2.保存用户的两大机制
Session-保存在服务器端
Cookie-保存在客户端
3.Cookie 技术
3.1Cookie :中文名称为“小甜饼”,是web服务器保存在客户端的一系列文本信息。
3.2使用场景:
(1)、判断用户是否已登录,n天内保存登录状态。
(2)“购物车”处理。
(3)、保存浏览记录。
缺点:容易泄露用户信息。


3.3Cookie 的作用
(1)对特定对象的追踪;
(2)保存用户网页浏览记录与习惯;
( 3)简化登录。
(4)安全风险:容易泄露用户信息
3.4Jsp 中创建与使用Cookie
1)创建Cookie对象
Cookie newCookie = new Cookie(String key , Object value);
2)写入Cookie对象
response.addCookie(newCookie);
3)读取Cookie对象
Cookie[] cookies = request.getCookies();
3.5Cookie 的常用方法
| 类型 | 方法名 | 方法解释 |
| String | getComment() | 返回cookie中注释,如果没有注释的话将返回空值. |
| String | getDomain() | 返回cookie中Cookie适用的域名. 使用getDomain() 方法可以指示浏览器把Cookie返回给同 一域内的其他服务器,而通常Cookie只返回给与发送它的服务器名字完全相同的服务器。注意域名必须以点开始(例如.yesky.com) |
| int | getMaxAge() | 返回Cookie过期之前的最大时间,以秒计算。 |
| String | getName() | 返回Cookie的名字。名字和值是我们始终关心的两个部分,笔者会在后面详细介绍 getName/setName。 |
| String | getPath() | 返回Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面所在目录及其子目录下 的所有页面。 |
| boolean | getSecure() | 如果浏览器通过安全协议发送cookies将返回true值,如果浏览器使用标准协议则返回false值。 |
| String | getValue() | 返回Cookie的值。笔者也将在后面详细介绍getValue/setValue。 |
| int | getVersion() | 返回Cookie所遵从的协议版本。 |
| void | setComment(String purpose) | 设置cookie中注释。 |
| void | setDomain(String pattern) | 设置cookie中Cookie适用的域名 |
| void | setMaxAge(int expiry) | 以秒计算,设置Cookie过期时间。 |
| void | setPath(String uri) | 指定Cookie适用的路径。 |
| void | setSecure(boolean flag) | 指出浏览器使用的安全协议,例如HTTPS或SSL。 |
| void | setValue(String newValue) | cookie创建后设置一个新的值。 |
| void | setVersion(int v) | 设置Cookie所遵从的协议版本。 |
3.6 Cookie的代码实例:
(1)案例:十天免登陆
//login.jsp 登陆页面
<%@ 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>表单提交</title>
</head>
<body>
<%
String username = ""; String password = ""; Cookie[] cks = request.getCookies();
if (cks != null && cks.length > 0) {
for (Cookie c : cks) {
if (c.getName().equals("username")) {
username = c.getValue();
}
if (c.getName().equals("password")) {
password = c.getValue();
}
} }
%> <h1>post</h1>
<form action="dologin.jsp" name="loginForm" 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" checked="checked"
name="isUseCookie" value="十天内记住我的登陆状态" />十天内记住我的登陆状态</td>
</tr>
<br>
<tr> <td><input type="submit" value="提交" /></td> </tr>
</table>
</form> // dolphin.jsp 处理登陆页面
<%@page import="java.net.*"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1> doLogin </h1>
<%
request.setCharacterEncoding("UTF-8");
String username = ""; String password = "";
//处理中文乱码 (加编码)
username =URLEncoder.encode(request.getParameter("username"),"UTF-8") ;
password=URLEncoder.encode(request.getParameter("password"),"UTF-8") ; password = request.getParameter("password");
String [] isUseCookie = request.getParameterValues("isUseCookie"); if(isUseCookie !=null && isUseCookie.length>0){
//说明勾选了
Cookie ck_username= new Cookie("username",username);
Cookie ck_password= new Cookie("password",password);
//设置Cookie 的有效期,以秒为单位
ck_username.setMaxAge(60*60*24*10);//10天=864000秒 ck_password.setMaxAge(864000);
//写入Cookie 对象
response.addCookie(ck_username);
response.addCookie(ck_password);
}else{ //如果说没有勾选
Cookie [] ck=request.getCookies();//读取Cookie 对象
for(Cookie c : ck){
if(c.getName().equals("username")
|| c.getName().equals("password")){
//因为不保存,设为马上过期
c.setMaxAge(0); response.addCookie(c);//因为要覆盖之前的
}
} } %> //index.jsp 查看Cookie 数据的页面
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%> <%
request.setCharacterEncoding("UTF-8");
String username = ""; String password = ""; Cookie[] cks = request.getCookies();
if (cks != null && cks.length > 0) {
for (Cookie c : cks) {
if (c.getName().equals("username")) {
//处理中文乱码(解码)
username = URLDecoder.decode(c.getValue(),"UTF-8");
}
if (c.getName().equals("password")) {
password = URLDecoder.decode(c.getValue(),"UTF-8");
}
} }
%>
cookie中的用户名:<%=username %>
cookie中的密码:<%=password %>
3.7 Session 与 Cookie 的对比
1.保存位置:session在服务器端内存,cookie在客户端文本
2.保存对象:session保存Object类(保存对象大小没有限制),cookie保存String类型(保存对象大小有限制)
3.生存权:session会话结束即销毁,cookie可以长期保存在客户端
4.重要性:session安全性更高,保存重要信息,cookie保存不重要的信息

jsp04状态管理的更多相关文章
- Redux状态管理方法与实例
状态管理是目前构建单页应用中不可或缺的一环,也是值得花时间学习的知识点.React官方推荐我们使用Redux来管理我们的React应用,同时也提供了Redux的文档来供我们学习,中文版地址为http: ...
- 表格搞定 Asp.net Web 状态管理
最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...
- [译]面向初学者的Asp.Net状态管理技术
介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...
- [Asp.Net]状态管理(Session、Application、Cache)
上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...
- [Asp.Net]状态管理(ViewState、Cookie)
简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请 ...
- HttpClient_HttpClient 4.3.6 HTTP状态管理
HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...
- Ansible状态管理
转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...
- ASP.NET状态管理详解,让你明明白白
开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协 ...
- 状态管理cookie 案例
1状态管理:服务器为了追踪同一个客户端发出的请求,将多次交互看成一个整体看待 2:cookie的生存时间,默认情况下,cookie保存在浏览器内存中,只要不关闭浏览器,cookie就一直存在 如果希望 ...
随机推荐
- 软工冲刺-Alpha 冲刺 (3/10)
队名:起床一起肝活队 组长博客:博客链接 作业博客:班级博客本次作业的链接 组员情况 组员1(队长):白晨曦 过去两天完成了哪些任务 描述: 很胖,刚学,照猫画虎做了登录与注册界面. 展示GitHub ...
- JavaWeb基础 - 会话
会话概述 什么是会话 简单的理解:用户打开浏览器,点击多个超链接,访问Web服务器上多个资源,然后关闭浏览器,整个过程称之为一次会话. 需要解决的问题 每个用户在使用浏览器与服务器会话的过程中,会产生 ...
- TCP系列10—连接管理—9、syncookie、fastopen与backlog
这部分内容涉及较多linux实现,可以跳过. 一.listen系统调用对backlog的处理 当socket处于LISTEN或者CLOSED状态时,fastopen队列的长度可以通过TCP_FASTO ...
- Github Atom汉化方式
1.下载:Atom https://atom.io/ 2.安装 3.菜单栏 -- Setting --- Install --- 搜索Chinese --安装汉化包 4.重启 生效.
- vue-cli3配置postcss-cssnext
1. // npm install autoprefixer --save-dev 此步不需要了,因为postcss-cssnext自带这个依赖 npm install postcss-cssnext ...
- request设置属性 一般当做下一个页面的结果集
request设置属性 一般当做下一个页面的结果集
- BZOJ 1036 树的统计(树链剖分)
点权树链剖分模板题. # include <cstdio> # include <cstring> # include <cstdlib> # include &l ...
- Python 断言和异常
Python 断言和异常 Python断言 断言是一种理智检查,当程序的测试完成,可以将其打开或关闭.断言的最简单方法就是把它比作raise-if语句(或更加准确,raise-if-not声明).一个 ...
- HTML5语义元素总结
HTML5语义元素 语义=意义 语义元素=元素的意义 什么事语义元素? 一个语义元素能够清楚的描述其意义给浏览器和开发者. 无语义 元素实例:div.span.无需考虑内容. 语义 元素实例:fo ...
- 【刷题】BZOJ 1002 [FJOI2007]轮状病毒
Description 轮状病毒有很多变种,所有轮状病毒的变种都是从一个轮状基产生的.一个N轮状基由圆环上N个不同的基原子 和圆心处一个核原子构成的,2个原子之间的边表示这2个原子之间的信息通道.如下 ...