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就一直存在 如果希望 ...
随机推荐
- M2功能规格说明书
1.目的: 这篇随笔是简述我们团队所做的工程所能实现的功能及方便用户的使用. 2.假定和约束: 我们先限定为本地连接数据库进行各种操作的实现.用户电脑中需要有FLASH工具及快播插件.其他只需要了解基 ...
- Swift-map()跟flatMap()区别
map()方法介绍 map() 是 Array 提供的方法,通过接收一个函数作为传入参数,对数组中每个元素进行函数变换得到新的结果值.这样只需要提供 X->Y 的映射关系,就能将数组 [X ...
- 软工网络15团队作业4——Alpha阶段敏捷冲刺-1
各个成员在 Alpha 阶段认领的任务 成员 Alpha 阶段认领的任务 肖世松 编写界面设计代码 杨泽斌 服务器连接与配置 叶文柠 数据库连接与配置 谢庆圆 编写功能板块代码 林伟航 编写功能板块代 ...
- Visual Studio 数据库架构比较
一.前言 开发的时候在测试服务器上和线网服务器上面都有我们的数据库,当我们在线网上面修改或者新增一些字段后,线网的数据库也需要更新,这个时候根据表的修改记录,然后在线网上面一个一个增加修改很浪费效 ...
- Android基础------高级ul:消息提示
前言:Android消息提示笔记,刚刚接触Android 1.静态方法Toast 直接调用静态方法 //消息提示(context,"内容",固定时间) Toast.makeText ...
- [剑指Offer] 50.数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内. 数组中某些数字是重复的,但不知道有几个数字是重复的.也不知道每个数字重复几次.请找出数组中任意一个重复的数字. 例如,如果输入长度为 ...
- 在ios 上 按钮 disabled 样式显示异常
将input,button或textarea设置为disabled后,在iphone手机上样式将被覆写-webkit-appearance:none; 文字的颜色还是灰色. 原本在android 上 ...
- asp.net获取文件绝对路径
一般我们在asp.net中使用HttpContext.Current.Request.MapPath或者 HttpContext.Current.Server.MapPath来获取文件的绝对路径, p ...
- 单点登录Windows实现
Windows实现步骤: server.xml修改方式 hosts修改方式 CAS客户端配置 CAS配置filter.txt内容如下: <!-- ======================== ...
- [洛谷P4248][AHOI2013]差异
题目大意:给一个长度为$n$的字符串,求: $$\sum\limits_{1\leqslant i<j\leqslant n}|suf_i|+|suf_j|-2\times lcp(suf_i, ...