目录
1、简介
1.1、什么是会话
用户打开浏览器,浏览不同的网页(资源),发出多个请求,直到关闭浏览器的过程,称为一次会话(多次请求)。
1.2、会话的作用
我们在会话的过程(多次请求)之中,用户可能会产生一些数据,这些数据话有的需要保存起来的,我们就可以通过会话技术来保存用户各自的数据。
1.3、常用的会话技术
常用的会话技术Cookie和Session。
1.4、Cookie
1.4.1 什么是Cookie?
Cookie是客户端(浏览器)的技术,用户浏览的信息以键值对(key=value)的形式保存在浏览器上。如果没有关闭浏览器,再次访问服务器,会把cookie带到服务端,服务端就可以做响应的处理。
1.4.2、Cookie的说明
1.单个cookie大小不超过4kb。
2.同一个域名下cookie的数量一般不超过20个(浏览器不同,会不同)。
3.cookie用于存储少量不敏感的数据。
4.cookie可以用来区分不同的客户端(在不登录时候,配合session)。
1.4.3、Cookie的创建
//Cookie的创建
Cookie cookie = new Cookie(“username”,”haoren”)
//设置Cookie的存活时间(单位:秒)
cookie.setMaxAge(3600);
//(注意:正数:持久化(外存),负数:默认值(存在内存),零:删除cookie)
//设置Cookie的作用域
c.setPath("/");//所有webapp都可以看到这个cookie
c.setPath("/Web1")//只有Web1可以看到
//写出Cookie:
response.addCookie(c);
//读取cookie
Cookie[] cookies = request.getCookies();
1.4.4、记录客户上次登录时间
package com.org.controller;
import com.org.domain.User;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
@WebServlet("/ServletDemo9")
public class ServletDemo9 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
Cookie[] cookies = req.getCookies();
//当有time这个cookie时候设置为true
boolean flag = false;
if(cookies!=null && cookies.length>0){
for (Cookie cookie : cookies) {
if("time".equals(cookie.getName())){
flag = true;
//要处理编码的问题
resp.getWriter().print("上次访问时间:"+ URLDecoder.decode(cookie.getValue(), "utf-8"));
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
ck.setMaxAge(3600);
ck.setPath("/servlet");
resp.addCookie(ck);
break;
}
}
if(flag==false){
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
ck.setMaxAge(3600);
ck.setPath("/servlet");
resp.addCookie(ck);
}
}
if(cookies==null || cookies.length==0){
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Cookie ck = new Cookie("time", URLEncoder.encode(sf.format(new Date()),"utf-8"));
ck.setMaxAge(3600);
ck.setPath("/servlet");
resp.addCookie(ck);
}
}
}
1.5、Session
1.5.1、什么是Session
session是服务器端的技术。服务器为每一个浏览器开辟一块内存空间,即session。由于内存空间是每一个浏览器独享的,所有用户在访问的时候,可以把信息保存在session对象中。同时,每一个session对象都对应一个sessionId,服务器把sessionId写到cookie中,再次访问的时候,浏览器会把cookie(sessionId)带过来,找到对应的session对象。
1.5.2、获得Session对象
//获得Session对象
HttpSession session = request.getSession();
//域对象(多次请求共享数据):
session.setAttribute(String name,Object value)
session.getAttribute(String name)
session.removeAttribute(String name)
1.5.3、Session什么情况会销毁
1、Session在服务器关闭
当服务器关闭(正常关闭和启动服务器,不能直接关闭虚拟机),两次获得的session对象还是同一个,tomcat帮我们做了session的钝化处理(将服务器内存中的session对象序列化到了外存中,见下图),
当服务器重启后又进行了session对象活化(又读入了内存)。
2、Session默认失效时间30分钟
在工程中web.xml中修改存活时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
默认配置是配置在config下的web.xml中
3、当浏览器关闭后,服务器不关闭,两次获得session不是同一个。
如果想要想要相同
Cookie ck = new Cookie(“JSESSIONID”,sesssion.getId());
ck.setMaxAge(3600);
response.addCookie(c);
1.5.4、登录
/**
* 登录
*/
if ("login".equals(userAction)) {
User user = new User();
try {
BeanUtils.populate(user,req.getParameterMap());
Map<String, String> error = ValidateDemo.validateUser(user);
if (error.isEmpty()){
UserService userService = new UserService();
boolean flag = userService.login(user.getUsername(), user.getPassword());
if (flag){
//判断是否需要用户名和密码
String[] autoLogins = req.getParameterValues("autoLogin");
if (autoLogins != null && autoLogins.length > 0){
//记录用户名和密码
Cookie userCookie = new Cookie("username", user.getUsername());
Cookie psdCookie = new Cookie("password", user.getPassword());
userCookie.setMaxAge(2592000);
psdCookie.setMaxAge(2592000);
userCookie.setPath("/servlet");
psdCookie.setPath("/servlet");
resp.addCookie(userCookie);
resp.addCookie(psdCookie);
//设置一个登录成功的标志
req.getSession().setAttribute("username",user.getUsername());
req.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(req,resp);
}else {
req.getSession().setAttribute("username",user.getUsername());
req.getRequestDispatcher("/WEB-INF/pages/index.jsp").forward(req,resp);
}
}else {
req.setAttribute("fail","登录失败!");
req.getRequestDispatcher("login2.jsp").forward(req,resp);
}
}else {
req.setAttribute("error",error);
req.getRequestDispatcher("login2.jsp").forward(req,resp);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
登录成功之后记录用户名和密码自动进入到主页。