验证码为什么要使用Session
1. 验证码的生成和登录时验证码的校验 属于多次请求,request无法完成!2. Cookie是有大小和个数的限制的,Session存到服务器端的技术,没有大小和个数的限制.
3. Cookie相对于Session来讲不安全.
Session是与每个请求消息紧密相关的,为此,HttpServletRequest定义了用于获取Session对象的getSession()方法,该方法有两种重载形式,具体如下。
public HttpSession getSession(boolean create)public HttpSession getSession()
上面重载的两个方法都用于返回与当前请求相关的HttpSession对象。
区别:
第一个getSession()方法根据传递的参数来判断是否创建新的HttpSession对象,如果参数为true,则在相关的HttpSession对象不存在时创建并返回新的HttpSession对象,否则不创建新的HttpSession对象,而是返回null。
第二个getSession()方法则相当于第一个方法参数为true时的情况,在相关的HttpSession对象不存在时总是创建新的HttpSession对象。
要想使用HttpSession对象管理会话数据,不仅需要获取到HttpSession对象,还需要了解HttpSession对象的相关方法。
HttpSession接口中定义的操作会话数据的常用方法。
HttpSession接口中的常用方法
方法声明功能描述String getId()用于返回与当前HttpSession对象关联的会话标识号long getCreationTime()返回Session创建的时间,这个时间是创建Session的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式long getLastAccessedTime()返回客户端最后一次发送与Session相关请求的时间,这个时间是发送请求的时间与1970年1月1日00:00:00之间时间差的毫秒表示形式void setMaxInactiveInterval(int interval)用于设置当前HttpSession对象可空闲的以秒为单位的最长时间,也就是修改当前会话的默认超时间隔boolean isNew()判断当前HttpSession对象是否是新创建的void invalidate()用于强制使Session对象无效ServletContext getServletContext()用于返回当前HttpSession对象所属于的WEB应用程序对象,即代表当前WEB应用程序的ServletContext对象void setAttribite(String name,Object value)用于将一个对象与一个名称关联后存储到当前的HttpSession对象中String getAttribute()用于从当前HttpSession对象中返回指定名称的属性对象void removeAttribute(String name)用于从当前HttpSession对象中删除指定名称的属性小结常用的api:
request.getSession(); // session的获取
session.setAttribute(key,value);// session 存储数据
session.getAttribute(key);// session 获取存储对应的数据
session.invalidate(); // session对象销毁
session.removeAttribute(key);// 将目标对象从session中移除
4. 保存验证码
开发步骤分解:
1. 创建一个servlet: AServlet.java2. 通过ASequest对象获取session对象,保存相关数据3. 浏览器不关闭时,我们新建另一个servlet: BServlet.java
4. Bservlet获取Aservlet保存的session数据
代码实现:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();// 获取session实例api // 服务器端创建session 自动发送会话级别Cookie JSESSIONID value : session.getId() // 存储数据 setAttribute session.setAttribute("heimasession","你好 session");// 服务器内存 session保存用户数据 session.setAttribute("tom","你好 tom");// 服务器内存 session保存用户数据 session.setAttribute("marry","你好 marry");// 服务器内存 session保存用户数据 // 只要浏览器不关闭, 多次请求 可以获取唯一session对象,获取session 存储的值 System.out.println("---session 保存数据完成。。。"); }获取session存储数据 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession();// 获取session实例api// if(jessionId==null){// create// }else {// jessessionid== sessi.getId(){// return session// }else{// create// }// } // 浏览器访问服务器 自动发送所有的cookie request.getSession(); // 判断 sessionId == JESSIONID VALUE是否相同 如果相同 :找到session对象 // 如果 sessionId != JESSIONID VALUE 服务器端重新创建session对象 // 获取session保存数据 // 手动 代码销毁session对象// session.invalidate();// 销毁session对象 String heimasession = (String)session.getAttribute("heimasession"); String tom = (String) session.getAttribute("tom"); String marry = (String) session.getAttribute("marry"); System.out.println("session value = "+heimasession+ " "+tom+" "+marry); } 注意 浏览器不要关闭! 因为cookie丢失,找不到服务器端的session对象
session默认销毁时间:30分钟!
session的创建
session默认的时间
session的销毁
