四大作用域
作用域 | 通信对象 | 有效范围 |
page |
pageContext |
当前页面有效 |
request |
request |
一次请求周期:从http请求发起,到服务器处理结束,返回响应的整个过程(转发) |
session |
session |
一个会话周期:从用户打开浏览器访问服务器开始,到用户关闭浏览器的整过程,可以有多个request |
application |
application |
从启动应用到关闭应用的整个过程,可以有多个session |
- 都有的方法
- void setAttribute(String name, Object Value);
- Object getAttribute(String name);
- void removeAttribute(String name);
- void removeValue(String value);
session对象
- 什么是session
- 1.session表示客户端与服务器的一次会话
- 2.session指的是用户在浏览某个网站时,从进入网站到浏览器关闭所经过的这段时间
- 3.从上面可以看出,session实际上是一个特定的时间概念
- 4.在服务器中保存着不同用户的不同session,一个用户就对应一个session
- session对象
- 1.session对象是一个JSP内置对象
- 2.session对象在第一个JSP页面被装载时自动创建
- 3.当一个客户访问一个服务器,可能需要在几个页面之间切换,服务器应当通过某种方法知道这是同一个用户,这就需要session对象
- 4.session对象是HttpSession类的实例
- 5.session对象可以通过request.getSession()获得
- session常用方法
- 1.Long getCreationTime() 返回session创建时间
- 2.String getId() 返回session创建时JSP引擎为他设置的唯一的ID号
- 3.Object setAttribute(String name, Object value) 给session对象绑定属性
- 4.Object getAttribute(String name) 获得属性,如果没有name,则返回null
- 5.String[] getValueNames() 返回一个包含此session中所有可用属性的数组
- 6.int getMaxInactiveInterval() 返回会话超时时间(单位秒)
- 7.void setMaxInactiveInterval(int time) 设置会话超时时间
<%
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日:HH-mm-ss");
Date date = new Date(session.getCreationTime());
session.setAttribute("username", "jack");
session.setAttribute("password", "123");
session.setAttribute("age", 20);
%>
session创建时间:<%= session.getCreationTime() %> 就是: <%= sdf.format(date) %><br>
session的ID:<%= session.getId() %><br>
session取得属性username----<%= session.getAttribute("user") %><br>
session中的所有属性:<br>
<%
String[] attrs = session.getValueNames();
if (attrs != null) {
for (int i = 0; i < attrs.length; i++) {
out.print(" "+attrs[i]+":"+session.getAttribute(attrs[i])+"<br>");
}
}
%>
session默认的超时时间:<%= session.getMaxInactiveInterval() %>秒<br>
<% session.setMaxInactiveInterval(5); %>
session自己设置的超时时间:<%= session.getMaxInactiveInterval() %>秒<br>
- 8.Enumration<String> getAttributeNames()取代了过时的getValueNames()方法
Enumeration<String> arr = session.getAttributeNames();
while (arr.hasMoreElements()) {
String string = (String) arr.nextElement();
System.out.println(session.getAttribute(string));
}
-
session的生命周期
- 1.创建:第一次访问jsp或者servlet时,如果访问的是jsp,那么就会创建session,如果访问的是servlet,那么就要看你是否需要session,也就是调用了getSession()方法。每次客户端向服务器发送请求时,都会将此seesionId携带过去,服务端会对此sessionId进行校验
- 2.活动:
- 会话中通过超链接打开的新页面属于同一次会话
- 只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话
- 除非本次会话的所有页面都关闭再重新访问某个JSP或者Servlet将会创建新的会话
-
特别注意:原有会话还存在,这个旧的sessionId仍然存在于服务端,只不过再也没有客户端会携带它然后交予服务端校验
- 3.销毁
session与cookie
- 会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话。常用的会话跟踪技术是Cookie与Session。Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端记录信息确定用户身份。
- 理论上,一个用户的所有请求操作都应该属于同一个会话,HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。那怎么办呢?就给客户端们颁发一个通行证吧,每人一个,无论谁访问都必须携带自己通行证。这样服务器就能从通行证上确认客户身份了。这就是Cookie的工作原理
- 查看某个网站颁发的Cookie很简单。在浏览器地址栏输入javascript:alert (document. cookie)就可以了
- Cookie具有不可跨域名性
- cookie常见属性
属性名 | 描述 |
String name |
该Cookie的名称。Cookie一旦创建,名称便不可更改 |
Object value |
该Cookie的值。如果值为Unicode字符,需要为字符编码。如果值为二进制数据,则需要使用BASE64编码 |
int maxAge |
该Cookie失效的时间,单位秒。如果为正数,则该Cookie在maxAge秒之后失效。如果为负数,该Cookie为临时Cookie,关闭浏览器即失效,浏览器也不会以任何形式保存该Cookie。如果为0,表示删除该Cookie。默认为–1 |
- session的使用要依赖于cookie,如果浏览器不支持cookie或者cookie被禁用了该怎么办呢? 这就要用到URL重写了。
- URL地址重写的原理是将该用户Session的id信息重写到URL地址中。服务器能够解析重写后的URL获取Session的id。这样即使客户端不支持Cookie,也可以使用Session来记录用户状态。
- HttpServletResponse类提供了encodeURL(Stringurl)实现URL地址重写
response.encodeURL("index.jsp")