1. 会话
•Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
•Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
 
2. API
javax.servlet.http.Cookie类用于创建一个Cookie,response接口也中定义了一个addCookie方法,它用于在其响应头中增加一个相应的Set-Cookie头字段。同样,request接口中也定义了一个getCookies方法,它用于获取客户端提交的Cookie。Cookie类的方法:
public Cookie(String name,String value) setValue与getValue方法 setMaxAge与getMaxAge方法 setPath与getPath方法setDomain与getDomain方法getName方法
 
3. 实例:
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // TODO Auto-generated method stub
  3. response.setCharacterEncoding("UTF-8");
  4. response.setContentType("text/html;charset=UTF-8");
  5.  
  6. PrintWriter out = response.getWriter();
  7. out.print("上次访问时间: ");
  8.  
  9. //get Cookie 获得上次写入的cookie
  10. Cookie[] cookies = request.getCookies(); //从request获得cookie数组
  11. for(int i=0; cookies!=null && i<cookies.length; i++)
  12. {
  13. if( cookies[i].getName().equals("lastAccessTime") )
  14. {
  15. long cookieValue = Long.parseLong(cookies[i].getValue());
  16. Date date = new Date(cookieValue);
  17. out.print(date.toLocaleString());
  18. }
  19. }
  20.  
  21. //write cookie 写入相应名字的cookie
  22. Cookie cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+""); //新建访问时间cookie
  23. cookie.setMaxAge(1*30*24*3600);
  24. cookie.setPath("/WebTest3");
  25. response.addCookie(cookie); //将cookie添加到response,将会返回到浏览器
  26.  
  27. }
cookie的一些细节
l一个Cookie只能标识一种信息,它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
l一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
l浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
l如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。
l注意,删除cookie时,path必须一致,否则不会删除
 
4.Session
Session生命周期: 第一次请求request.getSession()时创建, 创建后如果30分钟内没有使用,服务器就将其销毁:
l在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(session对象),注意:一个浏览器独占一个session对象(默认情况下)。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的session中,当用户使用浏览器访问其它程序时,其它程序可以从用户的session中取出该用户的数据,为用户服务。
Session和Cookie的主要区别在于:
•Cookie是把用户的数据写给用户的浏览器。
•Session技术把用户的数据写到用户独占的session中。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到session对象。
Web.xml中配置Session生命周期:
  1. <!-- 10 minutes 10分钟-->
  2. <session-config>
  3. <session-timeout>10</session-timeout>
  4. </session-config>
实例:
Servlet Demo4 写入Session
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // TODO Auto-generated method stub
  3. response.setCharacterEncoding("UTF-8");
  4. response.setContentType("text/html;charset=UTF-8");
  5. PrintWriter out = response.getWriter();
  6.  
  7. HttpSession session = request.getSession(); //获得Session
  8. String sessionID = session.getId();
  9. Cookie cookie = new Cookie("JSESSIONID", sessionID);
  10. cookie.setPath("/WebTest3");
  11. cookie.setMaxAge(30*60); //设置保存时间,不然关闭浏览器即销毁相应的Cookie
  12. response.addCookie(cookie);
  13. session.setAttribute("name", "bug a TV");
  14. out.print("bug");
  15.  
  16. //String url1 = response.encodeURL("/WebTest2/Demo4"); //如果浏览器的Cookie功能被关闭,则需要重写URL
  17. //String url2 = response.encodeURL("/WebTest2/Demo5");
  18. }
Servlet Demo5 读出Session
  1. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  2. // TODO Auto-generated method stub
  3. response.setCharacterEncoding("UTF-8");
  4. response.setContentType("text/html;charset=UTF-8");
  5. PrintWriter out = response.getWriter();
  6.  
  7. HttpSession session = request.getSession(false);
  8. if(session!=null)
  9. {
  10. String product = (String) session.getAttribute("name");
  11. out.print("name = " + product);
  12. }
  13. }


实现自动登录功能
首页JSP代码: welcome.jsp
  1. <body>
  2. Welcome: ${user.username} <br/>
  3. <a href="/WebTest3/1.html">Login</a> <br/>
  4. <a href="/WebTest3/Demo7">Logout</a> <br/>
  5.  
  6. </body>
注册表单 1.html
  1. <form action="/WebTest3/Demo6" method="post">
  2. 用户名:<input type="text" name="username"/> <br/>
  3. 密码: <input type="password" name="passwd"/><br/>
  4. 登录: <input type="submit" name="submit"/> <br/>
  5. 自动登录:<input type="checkbox" name="autoLogin" value="true"/> <br/>
  6. </form>
登录处理,建立Session Demo6.java
  1. @WebServlet("/Demo6")
  2. public class Demo6 extends HttpServlet {
  3. private static final long serialVersionUID = 1L;
  4.  
  5. /**
  6. * @see HttpServlet#HttpServlet()
  7. */
  8. public Demo6() {
  9. super();
  10. // TODO Auto-generated constructor stub
  11. }
  12.  
  13. /**
  14. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  15. */
  16. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  17. // TODO Auto-generated method stub
  18.  
  19. response.setCharacterEncoding("UTF-8");
  20. response.setContentType("text/html;charset=UTF-8");
  21. PrintWriter out = response.getWriter();
  22.  
  23. String username = request.getParameter("username");
  24. String passwd = request.getParameter("passwd");
  25. //System.out.println("log: " + username + " " + passwd);
  26.  
  27. ArrayList<User> list = DB.getAll(); //从数据库获取用户信息
  28. for(User user : list)
  29. {
  30. if(user.getUsername().equals(username) && user.getPasswd().equals(passwd)) //用户名密码校验
  31. {
  32. request.getSession().setAttribute("user", user);
  33. response.sendRedirect("/WebTest3/welcome.jsp"); //获得Session
  34. return;
  35. }
  36. }
  37.  
  38. out.write("Username or passwd Error");
  39. }
  40.  
  41. /**
  42. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  43. */
  44. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  45. // TODO Auto-generated method stub
  46. this.doGet(request, response);
  47. }
  48. }
  49.  
  50. class DB
  51. {
  52. private static ArrayList list;
  53. static
  54. {
  55. list = new ArrayList<User>();
  56. list.add(new User("kevin", "123456"));
  57. list.add(new User("xiang", "123456"));
  58. }
  59. public DB() {
  60. super();
  61. // TODO Auto-generated constructor stub
  62. }
  63.  
  64. public static ArrayList getAll()
  65. {
  66. return list;
  67. }
  68. }
登录用户User类
  1. public class User implements Serializable
  2. {
  3. private String username;
  4. private String passwd;
  5.  
  6. public User() {
  7. super();
  8. // TODO Auto-generated constructor stub
  9. }
  10. public User(String username, String passwd) {
  11. super();
  12. this.username = username;
  13. this.passwd = passwd;
  14. }
  15. public String getUsername() {
  16. return username;
  17. }
  18. public void setUsername(String username) {
  19. this.username = username;
  20. }
  21. public String getPasswd() {
  22. return passwd;
  23. }
  24. public void setPasswd(String passwd) {
  25. this.passwd = passwd;
  26. }
  27. }

登录注销Servlet Demo7

  1. public class Demo7 extends HttpServlet {
  2. private static final long serialVersionUID = 1L;
  3.  
  4. /**
  5. * @see HttpServlet#HttpServlet()
  6. */
  7. public Demo7() {
  8. super();
  9. // TODO Auto-generated constructor stub
  10. }
  11.  
  12. /**
  13. * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
  14. */
  15. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  16. // TODO Auto-generated method stub
  17.  
  18. HttpSession session = request.getSession();
  19. if( session==null)
  20. {
  21. response.sendRedirect("/WebTest3/welcome.jsp");
  22. return;
  23. }
  24. session.removeAttribute("user"); //删除Session中的User 注销
  25. response.sendRedirect("/WebTest3/welcome.jsp");
  26.  
  27. }
  28.  
  29. /**
  30. * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
  31. */
  32. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
  33. // TODO Auto-generated method stub
  34. this.doGet(request, response);
  35. }
  36.  
  37. }



 


 
 
 
 

JavaWeb -- 会话, Cookie 和 Session的更多相关文章

  1. 会话Cookie及session的关系(Cookie & Session)

    会话Cookie及session的关系(Cookie & Session) 在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用sess ...

  2. JavaWeb之Cookie和Session的区别

    Cookie和Session的区别 一.cookie机制和session机制的区别 ********************************************************** ...

  3. java基础学习:JavaWeb之Cookie和Session

    一.会话概述 1.1.什么是会话? 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话其中不管浏览器发送多少请求,都视为一次会话,直到 ...

  4. JavaWeb 补充(Cookie&JSP&Session)

    1. 会话技术     1. Cookie     2. Session 2. JSP:入门学习 会话技术 1. 会话:一次会话中包含多次请求和响应.     * 一次会话:浏览器第一次给服务器资源发 ...

  5. 【JavaWeb】 Cookie和Session

    Session和Cookie出现的原因: 由于Http是无状态的协议,会话之间没有任何关联,也就是上一次会话和下一次会话没有任何关联,因此出现了会话技术Cookie和Session 下面分别从Cook ...

  6. 会话Cookie与session的关系

    在通常的使用中,我们只知道session信息是存放在服务器端,而cookie是存放在客户端.但服务器如何使用session和客户端之间进行通信,以及jsessionId是怎么回事,这并没有一个完整和正 ...

  7. 【Javaweb】Cookie和Session

    会话技术 什么是会话 从浏览器访问服务器开始,到访问服务器结束,浏览器关闭为止的这段时间内容产生的多次请求和响应,合起来叫做浏览器和服务器之间的一次会话 会话管理作用 共享数据用的,并且是在不同请求间 ...

  8. IT兄弟连 JavaWeb教程 Cookie和Session应用结合使用

    一般对于不要求安全的非敏感数据,建议存储在Cookie中! 对于敏感的数据,占用空间较小的,建议存储在Session中! 对于敏感的,较大的数据,存数据库!

  9. Django 组件-cookie 与 session

    会话跟踪技术 1 什么是会话跟踪技术 我们需要先了解一下什么是会话!可以把会话理解为客户端与服务器之间的一次会晤,在一次会晤中可能会包含多次请求和响应.例如你给10086打个电话,你就是客户端,而10 ...

  10. Django框架07 /cookie和session

    Django框架07 /cookie和session 目录 Django框架07 /cookie和session 1. django请求生命周期 2. cookie 3. session 4. 总结 ...

随机推荐

  1. fastjson List<> 转Json , Json 转List<>

    SerializeWriter:相当于StringBuffer JSONArray:相当于List<Object> JSONObject:相当于Map<String, Object& ...

  2. [译]GLUT教程 - 改变窗体大小

    Lighthouse3d.com >> GLUT Tutorial >> Basics >> Resizing the Window 上一章的例子创建了两个窗体,命 ...

  3. nginx大量TIME_WAIT的解决办法 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

    vi /etc/sysctl.conf net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_tw_reuse=1 #让TIME_WAIT状态可以重用,这样即使TIME_W ...

  4. MIC的异步传输

    关于signal和wait,属于异步传输的语法,即CPU端无需等待offload语句返回,即可异步运行下面的代码.一般用于启动MIC代码段后,并发执行CPU代码,达到同步执行的目的.另外一种用法是使用 ...

  5. php 判断数组中是否有重复的值

    $input = array(4, "4", "3", 4, 3, "3"); $result = array_unique($input) ...

  6. 值类型,Nullable类型

    1. 值类型 比如说int吧,是值类型,是个struct,是这样声明的 public struct Int32 : IComparable, IFormattable, IConvertible, I ...

  7. PHP如何进阶,提升自己

    2017年6月15日14:32:51 今天看今日头条,刷到了一个话题?是:整天增删改查调接口,PHP程序员,如何突破职业瓶颈晋级? 晋级包括:职位晋级:技术能力晋级.当你的技术能力晋级了,职位晋级也就 ...

  8. Laravel开发:多用户登录验证(2)

    上一篇讲了最基本的User验证,现在来讲一下Admin的验证. 先贴代码, 路由:routes/web.php加上以下代码, //... Route::get('admin/login', 'Admi ...

  9. POJ3468_A Simple Problem with Integers(线段树/成段更新)

    解题报告 题意: 略 思路: 线段树成段更新,区间求和. #include <iostream> #include <cstring> #include <cstdio& ...

  10. 微信小程序 入门

    目录结构: app.json  .小程序的全局配置 pages:  当前小程序所有页面路径. window:小程序所有页面的顶部背景颜色,文字颜色定义在这里. tabBar:  设置底部 tab ne ...