当浏览器访问服务器时:会将本地的Cookie发送过去,其中有一个键值位JSESSIONID=32位16进制数的值,服务器会根据该值去session池查找session对象,以此判断是否
为一次会话,即同一用户。
当第一次访问服务器时不发送cookie,服务器会创建一个session对象,将其对应的key值(32位数),来创建新的cookie,当做JSESSIONID的值,写入浏览器。其中cookie对象
的setAge默认为-1,告知浏览器不保存该cookie,当浏览器关闭时,cookie失效,一次会话结束。
流程图:
获取session对象:
request.getSession();
利用session记录数据:
request.getSession().setAttribute("name", "session--"+name);
//把cookie技术和session技术联合起来做应用的一个例子---※功能:让用户在关闭浏览器之后,如果10分钟之内能够登录本站,还能访问到session中的信息
//向客户端写一个key为"JSESSIONID"用value为sessionid的cookie,
Cookie c = new Cookie("JSESSIONID",request.getSession().getId());
c.setMaxAge(60*10);//10分钟后过期
c.setPath( request.getContextPath() );//权限给本站内的所有网页或servlet
response.addCookie(c);
获取信息:
request.getSession().getAttribute("name");
服务器之所以知道当前用户为同一个是由于JSESSIONID对应的session对象,服务器对session对象管理30分钟,未在请求则删除,也可以手动删除(即安全退出)
//安全退出---只要让session对象无效就可以了
request.getSession().invalidate();
session对象删除,即便浏览器发来cookie中有JSESSIONID,池中已经没有,会当做新用户重新写入cookie
用户禁用cookie时:浏览器对cookie只接受不发送,此时需要进行重写URL技术,使得地址url自带jsessionid参数来告知服务器为同一用户
<h2>演示重写url技术---破解用户禁用cookie之后,我们session无效的问题</h2>
<form action="<%= response.encodeURL("SaveServlet") %>" method="post">
网页验证码session验证:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("image/jpeg");
int w = 60;
int h=30;
BufferedImage img = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
g.setFont(new Font("aa",Font.BOLD,18));
Random r = new Random();
int a = r.nextInt(10000);
//将生成的验证码放入session---真值
request.getSession().setAttribute("realCode", ""+a);
g.drawString(""+a, 0, h);
g.dispose();//把图形刷到img当中
ImageIO.write(img, "JPEG", response.getOutputStream());
}
String code = request.getParameter("code");//用户输入的
String realCode = (String) request.getSession().getAttribute("realCode");//后台保存的真值
if(code==null || !code.equals(realCode)){
out.println("验证码输入错误");
}
//用一次,清一次!
request.getSession().removeAttribute("realCode");//清除session中旧的验证
界面jsp:
<form action="session/LoginServlet" method="post">
<img src="servlet/ImgServlet"/><input type="text" name="code"/><br/>
<input type="submit" value="登录"/>
</form>