一、什么是HttpSesssion
javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!不是http协议定义的。
HttpSession概述
* HttpSession是由JavaWeb提供的,用来会话跟踪的类。session是服务器端对象,保存在服务器端!!!
* HttpSession是Servlet三大域对象之一(request、session、application(ServletContext)),所以它也有setAttribute()、getAttribute()、removeAttribute()方法
* HttpSession底层依赖Cookie,或是URL重写!
- session的实现原理
session底层是依赖Cookie的!我们来理解一下session的原理吧!
当我首次去银行时,因为还没有账号,所以需要开一个账号,我获得的是银行卡,而银行这边的数据库中留下了我的账号,我的钱是保存在银行的账号中,而我带走的是我的卡号。
当我再次去银行时,只需要带上我的卡,而无需再次开一个账号了。只要带上我的卡,那么我在银行操作的一定是我的账号!
当首次使用session时,服务器端要创建session,session是保存在服务器端,而给客户端的session的id(一个cookie中保存了sessionId)。客户端带走的是sessionId,而数据是保存在session中。
当客户端再次访问服务器时,在请求中会带上sessionId,而服务器会通过sessionId找到对应的session,而无需再创建新的session。
HttpSession原理(理解)
* request.getSession()方法:
获取Cookie中的JSESSIONID:
<> 如果sessionId不存在,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
<> 如果sessionId存在,通过sessionId查找session对象,如果没有查找到,创建session,把session保存起来,把新创建的sessionId保存到Cookie中
<> 如果sessionId存在,通过sessionId查找到了session对象,那么就不会再创建session对象了。
<> 返回session
如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。
下次请求时,再次执行request.getSession()方法时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使用的是同一session对象。
- 服务器不会马上给你创建session,在第一次获取session时,才会创建!request.getSession();
- request.getSession(false)、request.getSession(true)、request.getSession(),后两个方法效果相同,
第一个方法:如果session缓存中(如果cookie不存在),不存在session,那么返回null,而不会创建session对象。
二、HttpSession的作用
* 会话范围:会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束!
会话:一个用户对服务器的多次连贯性请求!所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器!
* 服务器会为每个客户端创建一个session对象,session就好比客户在服务器端的账户,它们被服务器保存到一个Map中,这个Map被称之为session缓存!
Servlet中得到session对象:HttpSession session = request.getSession();
Jsp中得到session对象:session是jsp内置对象之下,不用创建就可以直接使用!
* session域相关方法:
void setAttribute(String name, Object value);
Object getAttribute(String name);
void removeAttribute(String name);
使用session保存登录信息以及cookie保存信息
login.jsp
<body>
<%
//一定对于cookie要先进行非空判断
String uname="";
String upw ="";
Cookie[] cookies = request.getCookies();
if(cookies != null){
for(Cookie c : cookies){
if("uname".equals(c.getName())){
uname = c.getValue();
}
if("upw".equals(c.getName())){
upw = c.getValue();
}
}
}
%>
<%
//先定义为空,不然会在顶部显示null字符
String message = "";
String mesg =(String)request.getAttribute("mesg");
if(mesg!=null){
message = mesg;
}
%>
<h1>
登录
</h1>
<font color="red"><%=message %></font>
<form action = "/jspSessionCookie/LoginServlet" method="post">
姓名:<input type="text" name="username" value=<%=uname %>><br>
密码:<input type="text" name="password" value=<%=upw %>><br>
<input type="submit" name="submit">
</form>
</body>
/LoginServlet
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
if(username.equals("admin")&&password.equals("123456")){
Cookie cookies1 = new Cookie("uname", username);
Cookie cookies2 = new Cookie("upw", password);
cookies1.setMaxAge(60*60*24);
response.addCookie(cookies1);
cookies2.setMaxAge(60*60*24);
response.addCookie(cookies2);
HttpSession session = request.getSession();
session.setAttribute("username", username);
session.setAttribute("password", password);
response.sendRedirect("/jspSessionCookie/login/succ1.jsp");
}else{
request.setAttribute("mesg", "用户名或者密码错误");
request.getRequestDispatcher("/login/login.jsp").forward(request, response);
}
}
succ1.jsp
<body>
<h1>succ1</h1>
<%
String username = (String)session.getAttribute("username");
if(username==null){
request.setAttribute("mesg", "不要冒充我最重要的人");
request.getRequestDispatcher("/login/login.jsp").forward(request, response);
return;
}
%>
<h1>欢迎<%=username %>到来</h1>
<h1>很开心你终于来了<br>在我差一点放弃的时刻</h1>
</body>