会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话。通常会话是长期保持的,无论用户关闭多少次浏览器,这个会话都要存在。每个用户在使用浏览器与服务器进行会话的过程中,不可避免各自会产生一些数据,程序要想办法为每个用户保存这些数据。
那么,客户端和服务器到底该如何保存这些数据呢?Java衍生了两个技术:Session和Cookie。
Cookie
是客户端技术,服务器通过Response
将每个用户的数据以Cookie的形式发送给浏览器,浏览器将其存储在自己的内存中,当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的Cookie
去。服务器可以通过Request
拿到该用户的Cookie
。这样,web资源处理的就是用户各自的数据了。
如何创建Cookie
//name:标识该信息的名称 value:设置值
Cookie cookie = new Cookie(String name,String value);
服务器如何将Cookie响应回传给客户端
Response.addCookie(Cookie);
服务器如何查看客户端携带的Cookie
Cookie[] cookies = Request.getCookie();
Cookie.getName();
Cookie.getValue();
案例:使用cookie记录用户上一次访问的时间
public class CookieTest extends HttpServlet {
//定义一个标志位,初始值为false,用来判断用户是否是第一次访问该url
boolean flag = false;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//避免乱码问题:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//通过请求获取用户的Cookie
Cookie[] cookies = request.getCookies();
if (flag){//flag=true,表示用户不是第一次访问该url
if (cookies!=null){//你有cookie
for (int i = 0; i < cookies.length ; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastLoginTime")){
response.getWriter().println("你上一次来的时间为:"+cookie.getValue());
System.out.println("刷新了cookie");
}
}
}
}else { //flag=false,表示用户是第一次访问该url
response.getWriter().println("这是您第一次访问该页面");
}
//建立一个cookie,并把这个cookie发给客户端
response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
//将flag置为true,当用户再次访问该url时,会直接进入读取cookie的逻辑
flag = true;
}
}
注意事项
Session
是服务器端技术,默认情况下,一个浏览器独占一个session
对象。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session
中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session
中取出该用户的数据,为用户服务。可以通俗的理解为,一个用户可以通过一个Session
访问多个Web资源,且各个Web资源可以通过Session
读取保存的用户数据。
Session
实现原理:服务器创建session
出来后,会把session
的id号,以cookie
的形式回写给客户机,这样,只要客户机的浏览器不关,再去访问服务器时,都会带着session
的id
号去,服务器通过识别客户机浏览器的session_id
,就会使用内存中与之对应的session
为之服务。
事实上,只要客户端一旦连接上服务器,服务器就会自动产生Session,Session可以在一个会话中传递数据(即多个程序通过session获取数据),如果服务器重启,存储在session中的数据就会丢失。
如何获取Session对象
//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);
}
public class SessionTest01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
HttpSession session = req.getSession();
String id = session.getId();
resp.getWriter().println("获得一个sessionId:
"+id);
String name = "Curry";
session.setAttribute("username",name);
resp.getWriter().println("当前session设置了一个用户名:
"+name);
}
}
public class SessionTest02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html");
String username = (String) req.getSession().getAttribute("username");
resp.getWriter().println("从session中获取到的用户名为:
"+username);
}
}
如何注销Session?
session对象默认30分钟没有使用,则服务器会自动销毁session
可以使用以下两种方式注销Session:
request.getSession().invalidate();
web.xml
文件中配置session的失效时间 :
<session-config>
<session-timeout>15session-timeout>
session-config>
Cookie
是把用户的数据写给用户的浏览器,属于客户端技术。
Session
是把用户的数据写到用户独占的session
中,属于服务端技术。
Session
对象由服务器创建,开发人员可以调用request
对象的getSession
方法得到session
对象。