在学习完了request和response之后,我们来一起学习session对象,可以说,session对象和request对象是九大对象里最为重要的两个对象。
session对象简介
在前面讲解session属性范围的时候,已经学习了关于session的一些用法,但是在实际的开发中,session的最为主要的用处是完成用户的登录、注销等常见的功能的,每一个session对象都表示不同的访问用户。
session是javax.servlet.http.HttpSession接口的实例化对象,所有session只能应用在HTTP协议上。
HttpSession接口的主要方法
注意: 关于session的方法,同学们在查找API的时候的注意了,凡是方法后面带有Deprecated的就表示这组方法是过时的,也就是废弃的不用的方法。
对于session的方法,我们和以前一样,一个一个的来看一下它们的用法,前面也说过了,它的用处主要体现在登录注销上。
Session ID
对于用户而言,一个用户就是一个不同的session,那么为了防止出现重复的用户,就引入了session ID,即每一个通过浏览器连接到服务器上的用户都会由服务器自动的分配一唯一的不会重复的编号。看下面一个关于session ID的例子
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
- <html>
- <head>
- <title>web开发title>
- head>
- <body>
- <%
- String id=session.getId();
- %>
- <h3>session ID:<%=id%>h3>
- <h3>session ID长度:<%=id.length()%>h3>
- body>
- html>
运行一下可以发现,取得的session ID是一串自己看不懂的字符串,那就是服务器给你(用户)自动设置的session ID。
每一个连接到服务器上的session ID是完全不同的,所有服务器就是依靠这些完成。
这儿在多说一点,如果还记得在jsp内置对象【04】response对象中的cookie的话,你可以发现我们取得的session ID就是当时的那个cookie。
这儿注意,如果重新启动服务器然后再运行程序,发现session ID变化了,也就是说服务器重启后,session ID会重新分配,当然,如果想要即使关闭服务器依然能保存住当前的ID,可以去tomcat/conf/server.xml中去设置,我们这儿就不多说了。
登录及注销操作
前面已经说过,session在所有的项目开发中用的最多的地方就是登录验证及注销操作,一个例子说明:
我们要做三个页面:
1. login.jsp :完成登录表单,向本页进行数据提交。
2. welcome.jsp 此页表示用户必须在登录后才可以访问到本页
3. logout.jsp 完成注销操作。
- Login.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
- <html>
- <head>
- <title>web开发title>
- head>
- <body>
- <form action="login.jsp" method="post">
- 用户名:<input type="text" name="uname"><br>
- 密码:<input type="password" name="upass"><br>
- <input type="submit" value="登录">
- <input type="reset" value="重置">
- form>
- <% //直接通过一个固定的用户名和密码
- String name=request.getParameter("uname");
- String password=request.getParameter("upass");
- if(!(name==null || "".equals(name)||password==null||"".equals(password))){
- if("zhaoyuqiang".equals(name) && "51cto".equals(password)){
- //如果登录成功,则设置session属性范围
- session.setAttribute("userid", name);
- response.setHeader("refresh","2;URL=welcome.jsp"); //2秒后跳转到welcome页
- %>
- <h3>用户登录成功,2秒后跳转到welcome.jsp页面中去h3>
- <h3>如果没有跳转成功,请点击<a href="welcome.jsp">这里a>>h3>
- <%
- }else{
- %>
- <h3>错误的用户名或密码h3>
- <%
- }
- }
- %>
- body>
- html>
- welcome.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
- <html>
- <head>
- <title>web开发title>
- head>
- <body>
- <%
- //如果已经设置过了session属性,则肯定不能为空
- if(session.getAttribute("userid")!=null){
- %>
- <h3>欢迎<%=session.getAttribute("userid")%>访问本页,
- <a href="logout.jsp">注销a>h3>
- <%
- }else{
- %>
- <h3>请先进行<a href="login.jsp">登录a>!h3>
- <%
- }
- %>
- body>
- html>
- Logout.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
- <html>
- <head>
- <title>web开发title>
- head>
- <body>
- <%
- response.setHeader("refresh","2;URL=login.jsp");
- session.invalidate(); //注销,表示所有的session 失效了。
- %>
- <h3>您已经成功推出本系统,两秒后跳转到首页!h3>
- body>
- html>
不用我说,写上这三个页面后运行一下就可以发现session的妙用了。
有的同学可能还是没哟看出里面的妙处来,session对象只要用set定义了,就可以在任何页面中使用了,而且session.invalidate()方法的作用是清楚本次会话中的session,这就为注销操作提供了一个好的方法,注意,在登录页上,我们没有使用数据库,直接提交到了本页上。
以上的这种做法是属于session使用最多的一种登录验证操作了,可是除了这些之外,会话跟踪还有以下的四种技术:
1. 通过session提供的方法保存,这是最常用的一个方法。
2. 通过cookie
3. 通过表单的隐藏域来完成。
4. 通过你地址重写。
或许以后在SSH中的structs中的讲解中,可能会用到很多的关于地址重写的方式进行的。不过那属于我们后续的操作了。
判断新用户
在session的对象中可以使用isNEW()方法中判断一个用户是否是第一次访问页面
一个例子来说明:
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8" %>
- <html>
- <head>
- <title>web开发title>
- head>
- <body>
- <%
- if(session.isNew()){
- %>
- <h3>欢迎新用户光临!h3>
- <%
- }else{
- %>
- <h3>您已经是老用户了!h3>
- <%
- }
- %>
- body>
- html>
需要把浏览器重新启动一下,看一小效果。刷新一下就是老用户,这是与服务器端建立的一个联系,给浏览器自动的设置好一个cookie了
注意:
1.session ID的取得方法 getId()不是成对存在的,它没有setId()这个方法。因为它不是客户端设定的ID ,而是服务器自动分配给你的,这是服务器端的操作,客户端是无法介入的。