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状态管理的更多相关文章

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

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

  2. 表格搞定 Asp.net Web 状态管理

    最近在网上搜罗了 ASP.NET WEB 状态管理方面的一些内容,终于把这些内容整合总结了一下. 1. 希望自己通过整理,能够掌握一些,为自己投资. 2. 以便自己忘记,又要浪费时间搜罗. 3. 希望 ...

  3. [译]面向初学者的Asp.Net状态管理技术

    介绍 本文主要讲解Asp.Net应用程序中的状态管理技术(Asp.Net中有多种状态管理技术),并批判性地分析所有状态管理技术的优缺点. 背景 HTTP是无状态的协议.客户端发起一个请求,服务器响应完 ...

  4. [Asp.Net]状态管理(Session、Application、Cache)

    上篇博文介绍了在客户端状态管理的两种方式:http://www.cnblogs.com/wolf-sun/p/3329773.html.除了在客户端上保存状态外,还可以在服务器上保存状态.使用客户端的 ...

  5. [Asp.Net]状态管理(ViewState、Cookie)

    简介 HTTP协议是无状态的.从客户端到服务器的连接可以在每个请求之后关闭.但是一般需要把一些客户端信息从一个页面传送给另一个页面. 无状态的根本原因是:浏览器和服务器使用Socket通信,服务器将请 ...

  6. HttpClient_HttpClient 4.3.6 HTTP状态管理

    HTTP状态管理 最初的HTTP被设计成以状态.请求/应答为导向的协议,它被制作成是没有特殊条款的,以便在状态会话中能交换逻辑关系请求/应答.HTTP协议越来越受欢迎和被采用,越来越多的系统会在应用程 ...

  7. Ansible状态管理

     转载自:http://xdays.me/ansible状态管理.html 简介 就像所有服务器批量管理工具(puppet有DSL,salt有state)一样,ansible也有自己的状态管理组件 ...

  8. ASP.NET状态管理详解,让你明明白白

    开发WinFrom的程序员可能不会在意维护应用程序的状态,因为WinFrom本身就在客户端运行,可以直接在内存中维护其应用程序状态.但ASP.NET应用程序在服务器端运行,客户端使用无状态的http协 ...

  9. 状态管理cookie 案例

    1状态管理:服务器为了追踪同一个客户端发出的请求,将多次交互看成一个整体看待 2:cookie的生存时间,默认情况下,cookie保存在浏览器内存中,只要不关闭浏览器,cookie就一直存在 如果希望 ...

随机推荐

  1. C中的除法,商和余数的大小、符号如何确定

    对于C中的除法,商和余数的大小.符号是如何确定的呢?在C89中,只规定了如果两个数为正整数,那么余数的符号为正,并且商的值是接近真实值的最大整数.比如5 / 2,那么商就是2,余数就是1.但是,C89 ...

  2. 《梦断代码Dreaming In Code》阅读笔记(一)

    第0章!干得漂亮! 这是我看到这本书冒出来的第一个想法.身为计算机系的学生,对于从0开始的任何事情,都感到格外亲切. 进入阅读之后,疑惑.惊讶.感叹渐渐取代了之前轻松的心情,原来做软件竟是攀越一座又一 ...

  3. Android 数据存储 之 SQLite数据库详解

    . 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...

  4. JavaScript初探系列之面向对象

    面向对象的语言有一个标志,即拥有类的概念,抽象实例对象的公共属性与方法,基于类可以创建任意多个实例对象,一般具有封装.继承.多态的特性!但JS中对象与纯面向对象语言中的对象是不同的,ECMA标准定义J ...

  5. Linux系统的性能测试

    性能测试:CPU内存,硬盘IO读写,带宽速度,UnixBench 一.CPU物理个数.内核.超线程.多核心 1.登录Terminal,执行:cat /proc/cpuinfo,就会显示出主机的CPU详 ...

  6. solr 学习之solrJ

    solrJ是访问Solr服务的JAVA客户端,提供索引和搜索的请求方法,SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务. <!-- https://mvnreposi ...

  7. mysql突然无法启动的问题

    经常会有这样一个情况是:mysql跑了一段时间后,某一天我们需要重启服务的时候,发现停止后并不能正常启动,会报下面这种错误 这种情况发生的原因绝大多数都是权限的问题: 因为使用了一段时间后,使用期间表 ...

  8. ajax 请求 后台返回的文件流

    download(url) { var xhr = new XMLHttpRequest(); xhr.open('GET', url, true); // 也可以使用POST方式,根据接口 xhr. ...

  9. 【MVC】ASP.NET MVC5 使用MiniProfiler 监控MVC性能

    MiniProfiler ,一个简单而有效的迷你剖析器,可以有效的实时监控页面.通过直接引用.Ajax.Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL. ...

  10. 【bzoj1858】[Scoi2010]序列操作 线段树区间合并

    题目描述 lxhgww最近收到了一个01序列,序列里面包含了n个数,这些数要么是0,要么是1,现在对于这个序列有五种变换操作和询问操作: 0 a b 把[a, b]区间内的所有数全变成0 1 a b ...