前言
在完成购物车界面中购物列表查询出数据的时候,我发现方法其实有多种,其中session、cookie、application是我考虑可以使用到的。那么今天我们就来聊聊session、cookie、application的区别以及运用。
session_5">一、session
session_6">1、什么是session
session是服务器给客户端的一个编号。当一台WWW服务器
运行时,可能有若干个用户浏览正在运行在这台服务器上的网站。当每个用户首次与这台WWW服务器建立连接时,他就与这个服务器建立了一个Session,同时服务器会自动为其分配一个SessionID
,用以标识这个用户的唯一身份。
这个SessionID是由WWW服务器随机产生的一个由24个字符组成的字符串
。
除了SessionID,在每个Session中还包含很多其他信息。但是对于编写ASP或ASP.NET的程序员来说,最有用的还是可以通过访问ASP/ASP.NET的内置Session对象
,为每个用户存储各自的信息。
session_11">2、session的使用
ASP内一共建了7个对象,有Session、Application、Cookie、Response、Request、Server
等。在其他的服务器端脚本语言如JSP、PHP等中也有其类似的对象,只是叫法或者使用方法上不太一样。
使用首先第一点就是:ASP 判断Session变量是否存在的4种方法
如果去读取没有初始化的Session变量
,将得到Empty值
(空值)。所以可以利用该值来判断Session变量是否已经初始化。加入我们要判断名为sesName的变量是否已经建立,我们可以用以下4种方法:
//zouyan
1 、If Session("sesName") = "" Then ...
2 、If Session("sesName") = Empty Then ...
3 、If IsEmpty(Session("sesName")) Then ...
4 、If Cint(Session("sesName")) = 0 Then ...
其中第四种方法在Session变量没有初始化的情况下使用Cint函数来进行转换,将返回0值。
然后就是第二点: ASP.NET判断Session变量是否存在
//zouyan
if(Session[ "UserName "] == null)
//用if(Session[ "UserName "] == "") 或者if(Session[ "UserName "] == " ") ,否则会报错!
注意:没有使用Session对象时不能复制给其他变量,否则报错
session_31">3、session的缺点
- Session变量和cookies是同一类型的。如果某用户将浏览器设置为
不兼容
任何cookie,那么该用户就无法使用这个Session变量! - 因为创建Session变量有很大的随意性,可随时调用,不需要开发者做精确地处理,所以,
过度使用
session变量将会导致代码不可读而且不好维护
。 - 随着站点
访问量的增大
,服务器将会因此而无法正常运行
!
cookie_36">二、cookie
cookie_37">1、什么是cookie
Cookie意为“甜饼”,是由W3C
组织提出,最早由Netscape社区发展的一种机制。目前Cookie已经成为标准,所有的主流浏览器
如IE、Netscape、Firefox、Opera等都支持Cookie。
由于HTTP是一种无状态的协议
,服务器单从网络连接上无从知道客户身份。怎么办呢?就给客户端们颁发一个绿卡吧,每人一个,无论谁访问都必须携带自己的绿卡。这样服务器就能从绿卡上确认客户身份了。这就是Cookie的工作原理
。
Cookie实际上是一小段的文本信息。客户端请求服务器
,如果服务器需要记录该用户状态,就使用response向客户端浏览器颁发一个Cookie。客户端浏览器会把Cookie保存起来。当浏览器再请求该网站时,浏览器把请求的网址连同该Cookie一同提交给服务器。服务器检查该Cookie
,以此来辨认用户状态。服务器还可以根据需要修改Cookie的内容。
cookie_43">2、cookie的使用
举个栗子:解决http无状态的问题
有的登录界面,输入信息之后下面会有一个7天免登录的按钮。那我们就单独根据cookie来完成。
//zouyan
let express = require('express')
let cookieParser = require('cookie-parser')
let app = express()
app.use(express.static('public'))
//使用cookie-parser,解析浏览器携带过来的cookie为一个对象,随后转到request上
app.use(cookieParser())
“种”cookie
//zouyan
app.get('/t1', (request, response) => {
//当访问test1路由时会给客户端“种”一个cookie
//在express中给客户端“种”一个cookie,不用借助任何第三方库
//给客户端“种”下一个会话cookie
//response.cookie('demo',123)
//给客户端“种”下一个持久化cookie
response.cookie('demo', 123, { maxAge: 30 * 1000 })
response.send('<h2>南橙大帅哥种下一个cookie</h2>')
})
“读”cookie
//zouyan
app.get('/t2', (request, response) => {
//当访问test2时,会获取到浏览器携带过来的cookie
//在express中更翻遍的获取客户端携带过来的cookie,要借助一个中间件,名字:cookie-parser
console.log(request.cookies)
const { demo } = request.cookies
console.log(demo)
response.send('<h2>南橙大帅哥去读取一个cookie</h2>')
})
“删”cookie
//zouyan
app.get('/t3', (request, response) => {
//第一种删除方式:
//response.cookie('demo','',{maxAge:0})
//第二种删除方式:
response.clearCookie('demo')
response.send('南橙大帅哥删除了一个cookie')
})
cookie_93">3、cookie的缺点
- Cookie数量和长度的限制。每个domain最多只能有20条cookie,每个cookie
长度不能超过4KB
,否则会被截掉。 - 安全性问题。如果cookie
被人拦截
了,那人就可以取得所有的session信息。即使加密也与事无补,因为拦截者并不需要知道cookie的意义,他只要原样转发cookie就可以达到目的了。 - 有些
状态不可能保存
在客户端。
例如,为了防止重复提交表单,我们需要在服务器端保存一个计数器。如果我们把这个计数器保存在客户端,那么它起不到任何作用。
三、application
1、什么是application
当你创建一个ActionServerPages的时候,你就创建了一个类似子程序的东西。当你创建了一组ActionServerPages,那么你就是创建了一个application。
application对象提供了对javax.servlet.ServletContext对象的访问,用于多个程序或者多个用户之间的共享数据
。对于一个容器而言,每个用户都共用一个application对象
,这一点与session对象不同。服务器启动后就会产生application对象,当客户在所访问的网站的各个页面之间浏览时,所用的application对象都是一个,知道服务器关闭,且所有的客户的application对象都是一个
。
2、application的使用
简单应用——数字计数器(计算访问界面的次数)
显示如下:
代码如下:
//zouyan
<%@ 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>
<%
//获得num对象的值
Object numtemp = application.getAttribute("num");
//初始值设定num为0
if(numtemp==null){
application.setAttribute("num", "0");
}
String num = (String)application.getAttribute("num");
//没访问一次,给num值自增1
int n = Integer.parseInt(num)+1;
//将累加后的值赋给num对象
application.setAttribute("num", String.valueOf(n));
%>
访问次数是:<%=n %>
</body>
</html>
3、application的缺点
- 数据总是存储在服务端,安全性比较高,但不易存储过多数据。
- 检索数据速度快,但缺乏自我管理机制,数据不会自动释放。
四、总结
其实后期我还去了解了一下禁用 Cookies后,如何使用 Session ?
如果禁用了 Cookies,服务器仍会将 SessionID以 cookie 的方式发送给浏览器,但是,浏览器不再保存这个cookie (即SessionID) 了。
如果想要继续使用Session,就需要采用 URL 重写 的方式来实现,可以参考 :
https://www.cnblogs.com/Renyi-Fan/p/11012086.html.
我是南橙,一只逐渐秃头的橙子Orange。