会话跟踪:服务器端的技术:HttpSession对象:
1:原理:客户端浏览器第一次访问,服务器端创建一个会话对象。
并且具有id的唯一值。
依赖cookie将sessionId的值发送给客户端。
第二次请求的时候,客户端浏览器携带sessionId到服务器。服务器端获得sessionId,
从而实现了会话跟踪:
2:特点:创建在服务器端,并且保存在服务器端
.3:获得一个会话对象:
HttpSession session = request.getSession();
HttpSession session = request.getSession(boolean create);
解释:
request.getSession(); 获得了一个会话对象:
具体的过程:首先会去寻找服务器端是否存在sessionId具备的会话对象。,没有找到,创建。
如果找到该会话对象,使用原来的对象:
request.getSession(true); //作用和request.getSession();完全一样:
request.getSession(false); session不创建。
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/*
* 演示:获得一个HttpSession 对象:
*/
public class AServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
HttpSession session = request.getSession();
System.out.println(session.getId());// 获得id的值: // 0181C49A7E825C977A50EA54FF18316B
HttpSession session2 = request.getSession();// 同一个session 对象:
System.out.println(session2.getId());
}
依赖cookie将会话Id的值发送给客户端。
客户端也依赖cookie将sessionid的值发送给服务端。
4:session对象的作用:(超级重要*****)
(1)
域对象的范围:当前的会话。
域对象的作用:
使用会话存值和取值:
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class BServlet extends HttpServlet {
/*
* 演示域对象的作用:
* session :向域对象当中存值:
*/
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
//获得session对象:
HttpSession session = request.getSession();
//存值:
session.setAttribute("username", "王旭");
session.setAttribute("password", "888888");
}
}
实例:用HttpSession的实现用户的登陆:
下面代码为什么if语句一定要加回?
让下面的语句不再执行,即:用户名密码不正确就返回重定向
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserLogin extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
/*
* 1:获得前端页面的参数:
* 2: 校验:
* 3: 用户名称和密码的保存
* 4: 跳转到主页:
*/
// 1:获得前端页面的参数:
String username = request.getParameter("username");
String password = request.getParameter("password");
//2: 校验:
/*
* 长度:
* 格式校验:
* 正确性校验: admin admin
*/
if(!("admin".equals(username)&& "admin".equals(password))){
//返回到登录页面: 主要用来做页面的回显
request.setAttribute("username", username);
request.setAttribute("password", password);
//转发: 同一个request 对象: 重定向不是同一个request。
request.getRequestDispatcher("/user/login.jsp").forward(request, response);
return;
}
// 3: 说明用户名称和密码都是正确: 保存: 用户名和密码, 保证当前session当中, 不需要重复登录。
HttpSession session = request.getSession();
session.setAttribute("username", username.trim());
session.setAttribute("password", password.trim());
// 4: 跳转到登录成功的页面: //重定向:
response.sendRedirect("/javaEE-11/user/succ1.jsp");
}
}
-