一、session对象
1.session是什么?
session在网络中被称为会话。
由于HTTP协议(超文本传输协议)是一种无状态协议,也就是当一个客户向服务器发出请求,服务器接收请求,并返回响应后,该连接就结束了,而服务器并不保存相关的信息。
为了弥补这一缺点,HTTP协议提供了session
通过session可以在应用程序的WEB页面间进行跳转时,保存用户的状态,使整个用户会话一直存在下去,直到关闭浏览器。
但是,如果在一个会话中,客户端长时间不向服务端发出请求,session对象就会自动消失。这个时间取决于服务器,例如,Tomcat服务器默认为30分钟。不过这个时间可以通过编写程序进行修改。实际上,一次会话的过程也可以理解为一个打电话的过程。通话从拿起电话或手机拨号开始,一直到挂断电话结束,在这个过程中,可以与对方聊很多话题,甚至重复的话题。一个会话也是这样,可以重复访问相同的Web页。
2.运行机制
当一个session开始时,Servlet容器将创建一个Httpsession对象,在Httpsession对象中可以存放客户状态的信息(例如购物车)。
Servlet容器为Httpsession分配一个唯一标识符,称为session ID。 Servlet容器把session
ID作为Cookie保存在客户的浏览器中。
每次客户发出HTTP请求时,Servlet容器可以从HttpServletRequest对象中读取session
ID,然后根据session ID找到相应的Httpsession对象,从而获取客户的状态信息。
3.session对象的生命周期
session对象的生命周期:创建---->使用----->消亡以下3种方法可以结束session对象:
a. 关闭浏览器;
b. 请用HttpSession的invalidate()方法;
c. session超时。
(1)创建
//当客户端浏览器第一次访问服务器时,服务器为这个浏览器创建一个Session对象。
//在服务器端使用request.getSession()或request.getSession(true)方法来获得Session对象。
request.getSession() //获得Session对象
session.getId() //获得session对象的ID
(2)使用
//创建Session对象后,使用Session对象进行数据的存取和传输。
session.setAttribute(String name, Object obj) //将信息保存在session范围内
session.getAttribute(String name) //获取保存在session范围内的信息
session.getAttributeNames(); //返回Session对象中存储的每一个属性对象,枚举型
session.isNew(); //判断session对象是不是新的
//具体过程:
//a. 将产生的sessionID存入到Cookie中;
//b. 当客户端再次发送请求时,会将sessionID和request一起传送给服务器端;
//c. 服务器根据请求过来的SessionID与保存在服务端的Session对应起来,判断是否为同一个Session。
//注意:getAttribute()方法返回的是Object对象,如果将获取的信息赋值给String类型的变量,则需要进行强制类型转换或调用其toString()方法,例如,下面的两行代码都是正确的。
String user = (String)session.getAttribute("username");
String user1 = session.getAttribute("username").toString();
(3).设置Session对象的有效期
//a. 调用setMaxInactiveInterval(long n)进行设定;
// b. 在web.xml中修改:
<session-config>
<!-- 会话超时间长为30分钟 -->
<session-timeout>30</session-timeout>
</session-config>
(4).Session对象的判断
Srting username=session.getAttribute("username");
if(username==null){
response.sendRedirect("login");
}
二.Cookie
1. 概述
(1)用来存储客户端的一小段文本
(2)是一门客户端的技术,将数据保存到客户端;因为cookie是存储在客户端浏览器中的
(3)是为了实现 客户端与服务器端之间的状态的保持
(4)cookie技术,不安全,不要使用cookie存储敏感信息!比如登录状态和登录信息;
(5)一些敏感的数据 应该存储在服务器端
2. 常用方法
void setMaxAge(int e);
** 设置Cookie有效期,单位秒,正数为多少秒后失效;负数表示当浏览器关闭时,Cookie将会被删除(争议);零表示清空Cookie
int getMaxAge();
** 获取Cookie有的效时间,单位秒
void setValue(String value);
** 在Cookie创建后,对Cookie进行赋值
String getValue();
** 获取Cookie的值
String getName();
** 获取Cookie的名称
Cookie[] getCookies();
** 获取Cookie中所有的属性名
3.使用方式
//Cookie对象
(1)创建Cookie对象,绑定数据(在服务器端获取指定数据通过cookie保存)
Cookie cookie = new Cookie(key,value);
(2)发送Cookie对象(从服务端---》客户端)
response.addCookie(cookie)
(3)获取Cookie,获取数据(另外页面接收,读取内容)
Cookie [] cookies = request.getCookies()
<%
String username=request.getParameter("username");
//1.创建Cookie保存用户名
Cookie cookieUserName = new Cookie("username", username);
//2.写入客户端
response.addCookie(cookieUserName);
//3.获取Cookie,获取数据
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
break;
}
}
}
//注:setMaxAge() 设置cookie的存活
//cookie.setMaxAge(1*60*60*24*7);
//Cookie注意事项:
//1.如果保存的时候有特殊字符:空格 & - 需要编码和解码这个动作
//解决方法:
//URLEncoder.encode(s, "UTF-8");//编码
//%1BF%123%
//URLDecoder.decode(s, "UTF-8");//解码
%>