Cookie、Session、Application的学习
1. Cookie
Cookie是保存在客户端的临时文件
cookie以文件方式保存数据
浏览器会将Cookie的key/value保存到某个目录下的文本文件内(cookie储存在客户端)
- 添加数据
public void addCookie(Cookie cookie)
-获取数据
public Cookie[] getCookies() - 设置有效期
public void setMaxAge(int expiry) - 用户可以禁用cookie
cookie的安全性
cookie是全透明的,保存在此浏览器上的cookie,其他的浏览器都拿的到。
Cookie记录着用户的帐户ID、密码之类的信息,如果在网上传递,通常使用的是MD5方法加密。
cookie的用途
- 判定注册用户是否已经登录网站,在下一次进入此网站时保留用户信息以便简化登录手续
- “购物车”之类处理。用户可能会在一段时间内在同一家网站的不同页面中选择不同的商品,这些信息都会写入Cookies
例:使用cookie自动填写用户名
<%@page import="java.net.URLDecoder"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.Arrays" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>登录界面</title>
<%
// 读取cookie 并赋值给cu_name
String cu_name="";
Cookie[] cookies=request.getCookies();//获得Cookie
if(cookies!=null && cookies.length>0){
for(Cookie c:cookies){
if("cu_name".equals(c.getName())){//获得Cookie的key并判断
String cu_name_utf8=c.getValue();//获得Cookie的value
cu_name=URLDecoder.decode(cu_name_utf8, "utf-8");//使用指定的编码机制对其解码。
}
}
}
%>
</head>
<body>
<form action="/web03/login.jsp" method="post">
用户名称:<input type="text" name="cu_name" value="<%=cu_name %>" /><br />
用户密码:<input type="password" name="cu_phone" /><br />
<input type="submit" value="登录" /><a href="/web03/reg.jsp">还没有账号?</a>
</form>
</body>
</html>
1.URLEncoder.encode(String s, String enc)
使用指定的编码机制将字符串编码
URLDecoder.decode(String s, String enc)
使用指定的编码机制对其解码。
在跳转页面写以下代码
// 当你用户名和密码判断正确的时候 将用户名保存至cookie
// 保存cookie是浏览器的动作 如果放在跳转之后 代码是执行的 但是浏览器已经跳转了 就无法保存
String cu_name_utf8=URLEncoder.encode(cu_name, "utf-8");//使用指定的编码机制将字符串编码
Cookie cookie = new Cookie("cu_name",cu_name_utf8); // new Cookie(String key,String value);
//cookie.setMaxAge(600); //单位是秒 是cookie的保存的最大时间 时间到了 浏览器自动清除
//cookie如果中文乱码的解决方法
response.addCookie(cookie);//保存cookie
2. Session
session是什么
Session:在计算机中,尤其是在网络应用中,称为"会话控制"。Session 对象存储特定用户会话所需的属性及配置信息。(Session储存在服务器端)
使用会话对象session实现
- 一个会话就是浏览器与服务器之间的一次通话
- 会话可以在多次请求中保存和使用数据
session什么时候消失
如果用户关闭了浏览器,就不能保存Session的变量,Session就消失了。
session的语法
Public void setAttribute(String name, Object value);
用法:session.setAttribute(“userName”, “张三丰”);
Public Object getAttribute(String name);
用法:String userName=(String)session.getAttribute(“userName”);
session的工作方式
每个session都有一个唯一的sessionid
当一个session第一次被启用时,一个唯一的标识被存储于本地的cookie中。如果开两个相同的页面,sessionid是不一样的,是两个不同的Session。
session.getId();
public String getId();
会话的清除和过期
session的数据是在服务器端的,服务器保存的会话数据量会越来越大,从而导致性能问题
若没有清理机制,会导致性能问题或服务器崩溃
- 程序主动清除session数据
- 设置会话失效:session.invalidate();
- 移除会话的一个属性
语法 public void removeAttribute(String name);
用法:session.removeAttribute(“userName”);
- 服务器主动清除长时间【默认30分钟】没有再次发出请求的session
小结:
- 用浏览器访问服务器——产生会话
- 通过浏览器在网站登录——在会话中保存数据
- 登录成功后用个人身份进行访问——会话有效期内
- 关闭了浏览器——结束会话
- 服务器主动结束会话——会话到期
- 使会话失效、删除属性——及时释放会话资源
- 程序主动结束会话、会话到期——会话中的数据丢失
练习
登录页提交表单到对应的JSP页面
登录成功时在session中保存用户信息
在其他页面中从session中取出用户信息显示
清空session,实现注销
在跳转界面输入
//以session来保存用户名称 即可以解决中文的问题 还有一个非常重要的特点
//session的value可以存Object
session.setAttribute("cu_name", cu_name);
//session.setAttribute("sessionName",Object);用来设置session值的
response.sendRedirect("/web03/welcome.jsp");
//跳转界面
在欢迎界面得到用户名
<html>
<head>
<meta charset="UTF-8">
<title>欢迎界面</title>
</head>
<body>
<h1>欢迎您! <a href="/web03/logout.jsp"><%=session.getAttribute("cu_name") %></a> </h1>
//session.getAttribute("sessionName");用来得到对应名称的session值,即得到object对象,注意需要进行类型转换
</table>
</body>
</html>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%
//实现登出功能 -》 清除cookie后跳转至主页
Cookie c=new Cookie("cu_name","");
c.setMaxAge(0);
response.addCookie(c);
response.sendRedirect("/web03");
%>
3. Application
什么是application对象 ?
当Web服务器启动时,Web服务器会自动创建一个application对象。application对象一旦创建,它将一直存在,直到Web服务器关闭。
Application 对象用于存储和访问来自任何页面的变量(不到万不得已不会动用,会占用服务器内存),类似于 session 对象。不同之处在于,所有的用户分享一个 Application 对象,而 session 对象和用户的关系是一一对应的。
例:使用application统计页面访问次数
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>主页</title>
<%@ page import="java.util.Random" %>
<%
int count = 1000000;//设置访问数
if(application.getAttribute("count")==null){//获得访问数
application.setAttribute("count", 1000000);//设置访问数
}else{
int c = (int)application.getAttribute("count");
c+=new Random().nextInt(10000);
count=c;
application.setAttribute("count", c);
}
%>
</head>
<body>
<h1>欢迎您!您是我们网站的第<%=count %>个访问者</h1>
</body>
</html>
三个对象对比
request、session、application对比
相同点:都可以存储属性
不同点:
1. request中存储的数据仅在一个请求中可用
2. session中存储的数据在一个会话有效期内可用
3. application中存储的数据在整个Web项目中可用
Attribute方法对比
- request的Attribute是一次请求里的参数,仅属于当前请求;
- session的Attribute是一个会话里的参数,也就是页面没有关闭前或者页面关闭后session超时你所有请求保存的参数
- application的Attribute是服务端的参数,也就是服务器关闭前,所有请求保存的参数
所以一般情况application>session>request 也就是说后者能拿到的通常前者都能拿到.
gc垃圾回收机制
自动回收
什么时候释放
1.当没有任何变量指向这块空间的时候。jvm虚拟机自动释放,人为无法控制
2.jvm虚拟机关闭
jvm释放空间 不可控,什么时候释放,不知道
jvm 不管释放成不成功
强制回收
调用System.gc()
这个方法只是提醒虚拟机,程序员希望你在这回收一下对象,但回不回收还是虚拟机来决定,也就是说程序员对回不回收没有绝对的控制权。