`
sllizhimei
  • 浏览: 165667 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

Servlet介绍(3)-----cookie和session

阅读更多
一、关于cookie和session

1、cookie
  cookie的作用:cookie是小段文本信息,Web服务器将它发送给浏览器,然后在访问同一网站或域时,浏览器再将它返回给服务器。这样可以在浏览器端(客户端)保留一些适合保存在客户端的信息(比如用户的用户名、密码,用户访问站点时所使用的模板)。

  cookie的好坏?

  cookie可以很方便的将一些信息存放于客户端,但是存放于客户端有时候会出现一些安全和隐私方面的问题。简单的说,别人使用了你的电脑去访问一个网站,而由于上次你登录网站时选择了保存我的用户名和密码,这个时候访问的网站就会将一段cookie发送给你的机器。这样当其他人使用你的电脑的时候,网站并会不去关系现在是谁在使用你的电脑(网站的实现只关心它找到的你上次登录的cookie),这样别人登录的时候使用的你的帐号,所以可能会引发一些安全上的问题(尤其是公共场合的计算机)。      
  cookie虽然可以保存很多东西,但是由于cookie是存放于客户端的,而浏览器一般不会在客户端存放很多的cookie(磁盘也是要钱的!)一般浏览器都会限制每个cookie的大小(一般是4k),同一个站点的cookie的数量(一般是20),以及浏览器保存的所有cookie的数量(一般是300)。所以我们的应用最好不要使用太多的cookie。   
  cookie的使用很方便。服务器端需要向客户端发送cookies时只需要调用几个简单的函数即可以完成:      
Cookie cookie = Cookie(String name, String value)   
构造一个cookie对象,cookie的名字为name,cookie的值为value    cookie.setMaxAge(int expiry) //void setMaxAge(int expiry)   
设定一个cookie存在的时间(毕竟不会让它一直存在的),存在于客户端的参数为expiry秒。特殊的是当expiry值为-1的时候,代表关闭当前浏览器即失效。    httpServletResponse.addCookie(cookie)  //HttpServletResponse  void addCookie(Cookie cookie)   
调用这个方法才会将cookie发送至客户端。   
这样即可以将以name为名字,value为值的cookie保存至客户端。   
当服务器端需要判断请求的客户是否有以前的cookie时只需要调用    httpServletRequest.getCookies() // HttpServletRequest Cookie[] getCookies()   
该方法返回一个request中包含的cookie的数组,当没有cookie存在时,返回值为null。所以对cookies数组做迭代时,还是要先判断一下是否为null;       

下面以一个例子(两只Servlet程序)来结束cookie本部的介绍,关于cookie的其他方法可以查看api:

LoginServlet:

package squall.servlet.basic;

import java.io.IOException;

import java.io.PrintWriter;

import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


public class LoginServlet extends HttpServlet

{

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              Cookie[] cookies = request.getCookies();

              Cookie cookie = null;

              String userName = null;

              String password = null;

              boolean check = false;

              if(cookies != null)

              for(int i = 0; i < cookies.length; ++i)

              {

                     cookie = cookies[i];

                     if(cookie.getName().equals("UserName"))

                            userName = cookie.getValue();

                     if(cookie.getName().equals("Password"))

                            password = cookie.getValue();

                     if(cookie.getName().equals("Check"))

                            check = cookie.getValue().equals("Yes") ? true:false;

              }

              response.setContentType("text/html");

              PrintWriter out = response.getWriter();

              String docType = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              String title = "Login";

              out.println(docType + "<HTML> " + "<HEAD><TITLE>" + title

                            + "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            + "<CENTER> " + "<H1>" + title + "</H1> "

                            + "<FORM ACTION="LoginControlServlet" METHOD="POST">"

                            +(userName==null? "UserName:<INPUT TYPE="TEXT" NAME="UserName"><BR>" : "UserName:<INPUT TYPE="TEXT" NAME="UserName" VALUE=""+ userName + ""><BR>")

                            +(password==null? "Password:<INPUT TYPE="PASSWORD" NAME="Password"><BR>" : "Password:<INPUT TYPE="PASSWORD" NAME="Password" VALUE=""+ password + ""><BR>")

                            +(check ? "<INPUT TYPE="CHECKBOX" NAME="Check" CHECKED="true">": "<INPUT TYPE="CHECKBOX" NAME="Check">")

                            + "Don''t Ask Me Again"

                            + "<CENTER><INPUT TYPE="SUBMIT" VALUE="Login"></CENTER>"

                            + "</FORM>"

                            +"</CENTER></BODY></HTML>");

       }
  

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              this.doGet(request, response);

       }

      

}

LoginControlServlet:

package squall.servlet.basic;



import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class LoginControlServlet extends HttpServlet

{

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              if(request.getParameter("Check")!= null && request.getParameter("Check").equals("on"))

              {

                     Cookie cookie1 = new Cookie("Check","Yes");

                     cookie1.setMaxAge(3600 * 24 *30);

                     response.addCookie(cookie1);

                     Cookie cookie2 = new Cookie("UserName",request.getParameter("UserName"));

                     cookie2.setMaxAge(3600 * 24 *30);

                     response.addCookie(cookie2);

                     Cookie cookie3 = new Cookie("Password",request.getParameter("Password"));

                     cookie3.setMaxAge(3600 * 24 *30);

                     response.addCookie(cookie3);

              }

              response.setContentType("text/html");

              PrintWriter out = response.getWriter();

              String docType = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              String title = "Login";

              out.println(docType + "<HTML> " + "<HEAD><TITLE>" + title

                            + "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            + "<CENTER> " + "<H1>" + title + "</H1> "

                            +"UserName:" + request.getParameter("UserName") + "<BR>"

                            +"Password:" + request.getParameter("Password") + "<BR>"

                            +"</CENTER></BODY></HTML>");

       }



       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              this.doGet(request, response);

       }

      

}

LoginServlet和LoginControlServlet 分别 mapping至 /LoginServlet和/ LoginControlServlet
然后第一次访问http://127.0.0.1:8080/train/LoginServlet登录时不选择don’t ask me again,然后关掉窗口。第二次重新打开上面的url选择don’t ask me again 登录后关掉窗口。第三次访问时则不会再述要输入用户名和密码。PS:用户名、密码随便输入即可


2、session

由于http协议是一种无状态的协议,所以不通过其他手段的话,很难记录用户之前做过哪些事情。记录用户的状态,固然用cookie可以实现,但是cookie的大小和数量是存在限制的,并且还是存放于客户端的(客户端的cookie可以被人为的删除,而且在安全性上也是存在问题)。
session则和cookie的实现不一样,session是存放于服务器端的(基本可以理解成我们想放什么就可以放什么,我们想放多少就放多少)。session的实现机制,session既然是存在于server端的。那么我们当我们访问一个server的时候,server是如何找到我们对应的session的呢?一般情况下,当server端为一个用户创建一个session之后会将一个cookie,cookie的name为JSESSIONID,对应的值为一个字符串传递给client端,client端再次访问server端的时候,server会根据cookie中的JSESSIONID的值,来找到存放于server端的session。(浏览器禁用cookie的时候,我们可以将jseesionid和其对应的值显示在用户访问的每一个url上,当然用户禁用cookie的情况还是很少的,现在绝大多数浏览器默认页是支持cookie的。故这里不多讨论其实现的方式)
在我们使用session的时候,当然不需要自己用cookie这些东西去实现,我们只需要几个简单的调用即可以完成了。
首先我们需要获取一个session,获取一个session可以调用HttpServletRequest对象的HttpSession getSession()和HttpSession getSession(boolean create)来获取。HttpSession getSession()调用该方法返回一个session。当已经存在client端在server端已经存在session时,即返回已经存在的session。当session不存在时及创建一个新的session。所以这个调用不会给我们返回nullHttpSession getSession(boolean create)当参数create的值为true时,该调用等价于HttpSession getSession()。当参数create的值为false时,则client端在server端已经存在session时,返回已经存在的session,但是如果client端在server端还没有session时,则返回null。(通过这种参数为false的调用,我们可以实现当用户直接访问我们的网站的时候,我们让他直接去登陆页面。。。登录以后才能查看里面的内容)取得session之后使用起来也很简单,基本使用以下几个方法即可  
   void setAttribute(String name, Object value)

   Object getAttribute(String name)

   void removeAttribute(String name) 

     

   void setAttribute(String name, Object value)

   向session中添加一个名字为name,值为value的键值对(注意了哦,这里的value的类型是Object而不再是String)。当name已经在session中存在时,则替换name对应的值为value。

  

   Object getAttribute(String name)

   这个好像没有什么好说的,返回name对应的value。当然name不存在时候会返回null

   void removeAttribute(String name)

   删除name对应的键值对。



   Session其他常用的几个方法:

   void setMaxInactiveInterval(int interval)

   设置一个session当用户在interval秒内没有活动时即失效 (利用这个我们可以很方便的实现,当用户多长时间没有和我们的网站有任何交互时候让其需要重新登录才能继续浏览),如果不调用这个方法的话会根据容器的默认设置(一般为30分钟)

   void invalidate()

   将此session对象立即失效(会释放session占用的一些资源)(利用这个方法可以解决我们访问一个网站时,突然需要离开但不想关闭浏览器窗口。如果我离开后不希望别人能继续使用我已经登录的帐号做其他操作则可以提供一个注销的功能给用户,当用户点击注销的时候即调用此方法)。



下面还是一个例子,此例子包含的.java文件可能比较多:

先看下我们用于存放于session中的对象:User类

package squall.servlet.bean;


import java.io.Serializable;

public class User implements Serializable

{

       public User()

       {

       }



       public User(String name, String password)

       {

              this.name = name;

              this.password = password;

       }



       public String getName()

       {

              return name;

       }



       public void setName(String name)

       {

              this.name = name;

       }



       public String getPassword()

       {

              return password;

       }



       public void setPassword(String password)

       {

              this.password = password;

       }



       private String name = "";



       private String password = "";



}




SessionLogin:

 
package squall.servlet.basic;

import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;



public class SessionLogin extends HttpServlet

{



       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              Cookie[] cookies = request.getCookies();

              Cookie cookie = null;

              String userName = null;

              String password = null;

              boolean check = false;

              if(cookies != null)

              for(int i = 0; i < cookies.length; ++i)

              {

                     cookie = cookies[i];

                     if(cookie.getName().equals("UserName"))

                            userName = cookie.getValue();

                     if(cookie.getName().equals("Password"))

                            password = cookie.getValue();

                     if(cookie.getName().equals("Check"))

                            check = cookie.getValue().equals("Yes") ? true:false;

              }

              response.setContentType("text/html");

              PrintWriter out = response.getWriter();

              String docType = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              String title = "Login";

              out.println(docType + "<HTML> " + "<HEAD><TITLE>" + title

                            + "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            + "<CENTER> " + "<H1>" + title + "</H1> "

                            + "<FORM ACTION="SessionLoginControl" METHOD="POST">"

                            +(userName==null? "UserName:<INPUT TYPE="TEXT" NAME="UserName"><BR>" : "UserName:<INPUT TYPE="TEXT" NAME="UserName" VALUE=""+ userName + ""><BR>")

                            +(password==null? "Password:<INPUT TYPE="PASSWORD" NAME="Password"><BR>" : "Password:<INPUT TYPE="PASSWORD" NAME="Password" VALUE=""+ password + ""><BR>")

                            +(check ? "<INPUT TYPE="CHECKBOX" NAME="Check" CHECKED="true">": "<INPUT TYPE="CHECKBOX" NAME="Check">")

                            + "Don''t Ask Me Again"

                            + "<CENTER><INPUT TYPE="SUBMIT" VALUE="Login"></CENTER>"

                            + "</FORM>"

                            +"</CENTER></BODY></HTML>");

       }

      

       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              this.doGet(request, response);

       }

      

}



SessionLoginControl:




package squall.servlet.basic;



import java.io.IOException;



import javax.servlet.ServletException;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;



import squall.servlet.bean.User;



public class SessionLoginControl extends HttpServlet

{

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              if(request.getParameter("Check")!= null && request.getParameter("Check").equals("on"))

              {

                     Cookie cookie1 = new Cookie("Check","Yes");

                     cookie1.setMaxAge(3600 * 24 *30);

                     response.addCookie(cookie1);

                     Cookie cookie2 = new Cookie("UserName",request.getParameter("UserName"));

                     cookie2.setMaxAge(3600 * 24 *30);

                     response.addCookie(cookie2);

                     Cookie cookie3 = new Cookie("Password",request.getParameter("Password"));

                     cookie3.setMaxAge(3600 * 24 *30);

                     response.addCookie(cookie3);

              }

              HttpSession session = request.getSession();

              session.setAttribute("user", new User(request.getParameter("UserName"),request.getParameter("Password")));

              response.sendRedirect("SessionAttributeShow");



       }



       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              this.doGet(request, response);

       }

      

}





SessionAttributeShow:





package squall.servlet.basic;





import java.io.IOException;

import java.io.PrintWriter;



import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;



import squall.servlet.bean.User;



public class SessionAttributeShow extends HttpServlet

{

       protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              HttpSession session = request.getSession(false);

              if(session == null)

              {

                     response.sendRedirect("SessionLogin");

                     return;

              }

              User user = (User)session.getAttribute("user");

              if(user == null)

              {

                     response.sendRedirect("SessionLogin");

                     return;

              }

              response.setContentType("text/html");

              PrintWriter out = response.getWriter();

              String docType = "<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> ";

              String title = "Login";

              out.println(docType + "<HTML> " + "<HEAD><TITLE>" + title

                            + "</TITLE></HEAD> " + "<BODY BGCOLOR="#FDF5E6"> "

                            + "<CENTER> " + "<H1>" + title + "</H1> "

                            +"UserName:" + user.getName()+ "<BR>"

                            +"Password:" + user.getPassword() + "<BR>"

                            +"</CENTER></BODY></HTML>");

       }



       protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException

       {

              this.doGet(request, response);

       }

      

}





将SessionLogin,SessionLoginControl,SessionAttributeShow分别mapping至/SessionLogin,/SessionLoginControl,/SessionAttributeShow



访问http://127.0.0.1:8080/train/SessionLogin进行测试,输入用户名密码可以在

http://127.0.0.1:8080/train/SessionAttributeShow中看到输入内容,但是假如直接访问http://127.0.0.1:8080/train/SessionAttributeShow则会退到http://127.0.0.1:8080/train/SessionLogin要求你进行登录。





session的其他注意点,session中的对象是一直存在的,除非你手动的remove或者session失效,所以我们做应用的时候需要考虑什么东西是我们真的需要存放于session中的,session也需要占用内存和磁盘上的空间,session中存放大量对象将对系统性能产生很大的影响,对内存和资源的消耗也会增加。

由于容器一般会在内存不足时将不常用的session由内存转移(个人习惯叫钝化,反之为锐化)到磁盘。所以存放于session中的对象请实现java.io.Serializable接口,要不可能在特定的情况下因session中对象无法序列化而产生java.io.NotSerializableException
分享到:
评论

相关推荐

    servlet+cookie和Session

    总结来说,Servlet是Web应用的基石,它结合HttpServletRequest和HttpServletResponse处理请求和响应,通过Cookie和Session管理会话,与JSP协同工作呈现动态内容。而Filter、文件上传和下载等特性则扩展了Servlet的...

    Tomcat8亲测可用 tomcat-redis-session-manager的jar包

    标题中的“Tomcat8亲测可用 tomcat-redis-session-manager的jar包”指的是一个专为Tomcat8设计的,用于管理session的扩展组件。这个组件实现了将Tomcat应用服务器中的用户session数据存储到Redis分布式缓存系统中,...

    老杜Servlet笔记.zip

    2020-5-11 Servlet学习---Cookie 2020-5-11 Servlet中的路径 2020-5-11 Servlet学习---Session 2020-5-17 监听器学习 2020-5-17 IDEA中的Maven的简单使用 2020-5-18 JavaWeb学习 2020-5-19 JavaWeb学习 2020-5-21 ...

    Servlet对Cookie和Session的管理源码实例

    Servlet不仅能够生成动态内容,还能进行会话管理,其中最常用的就是Cookie和Session。本文将深入探讨Servlet如何管理和利用这两种技术进行会话跟踪。 **Cookie管理** Cookie是一种客户端存储机制,用于在用户的...

    java\Servlet技术--小例子.pdf

    - **会话管理**:通过 Cookie 和 Session 进行用户会话的跟踪和管理。 - **与数据库交互**:实现数据的查询、更新等操作。 #### 二、创建 Servlet 的步骤 本节通过一个简单的例子来说明如何创建一个基本的 Servlet...

    jsp和servlet之中的session详细介绍

    本文将深入探讨JSP和Servlet中的session概念,以及它们如何在Web应用程序中实现状态管理。HTTP协议本身是无状态的,这意味着每次客户端(浏览器)向服务器发送请求时,服务器无法识别请求是否来自同一个会话。为了...

    javafr_PROJET-JAVA-SERVLET-SIMULATION-SITE-ACHAT-_Selling

    6. **用户交互**:应用允许用户购买商品并发表评论,这需要用户认证和授权机制,可能使用了session或cookie来跟踪用户状态。 7. **MVC模式**:虽然没有具体代码,但这个项目可能采用了Model-View-Controller(MVC)...

    JavaWeb基础-Cookie和Session的简单使用案例

    在JavaWeb开发中,Cookie和Session是两种常见的用户会话管理技术,用于在客户端和服务器之间传递信息。本文将深入探讨这两个概念,并通过一个简单的登录案例来阐述它们的使用。 首先,Cookie是服务器发送到用户...

    cookie和session示例

    在Web开发中,Cookie和Session是两种非常重要的用户状态管理机制。它们被广泛用于跟踪用户的登录状态、个性化设置等,确保用户在不同页面之间切换时能够保持一致性体验。接下来,我们将详细探讨Cookie和Session的...

    memcached-session-manager-1.6.5.rar

    Memcached Session Manager 1.6.5的使用,首先需要在项目中引入对应的jar包,即"memcached-session-manager-1.6.5.jar"。这个jar包包含了所有必要的类和接口,使得Java应用程序能够与Memcached进行通信,实现会话...

    nginx集成memcached-session-manager所需要的jar

    Memcached-session-manager是Java应用程序,用于在Tomcat或其他基于Servlet的容器中管理会话,并将其存储在Memcached中,以实现会话的分布式和高可用性。 首先,我们需要理解会话管理在Web应用中的重要性。会话允许...

    JSP与Servlet复习

    ### JSP与Servlet复习知识点详解 #### 一、JSP与Servlet基础知识 **1.... - **定义**: Java Server Pages (JSP) 是一种基于Java技术的服务器端脚本...希望以上知识点能够帮助大家深入理解和掌握JSP与Servlet的相关知识。

    9--cookie&session;.docx

    在Web开发中,Cookie和Session是两种非常重要的用户会话管理技术。它们主要用来跟踪用户的状态,以便在多个页面间保持用户的登录信息或其他个性化设置。本文将深入探讨这两种技术及其在JavaEE企业全栈开发中的应用。...

    Servlet+Jsp--基于Java语言的Web宿舍管理系统.zip

    这通常通过Session和Cookie实现。 6. 错误处理与日志记录:系统应能处理异常情况,如用户输入错误、服务器错误等,并记录详细的日志信息,便于调试和问题追踪。 7. 响应式设计:为了适应不同设备的显示,JSP页面...

    Session Cookie的HttpOnly和secure属性

    其次,GlassFish2.x支持的是servlet2.5,而servlet2.5不支持Session Cookie的"HttpOnly"属性。不过使用Filter做一定的处理可以简单的实现HttpOnly属性。GlashFish3.0(支持servlet3.0)默认开启Session Cookie的...

    Servlet_Session和Cookie学习

    其中,Session和Cookie是两种常用的会话跟踪技术。Java Servlet技术作为Java EE的一部分,提供了会话跟踪的支持。 首先,让我们来定义什么是会话。在计算机科学领域,会话指的是一个有始有终的一系列动作的过程。...

    day16_cookie&session源代码.zip

    在Java Web开发中,处理Cookie和Session主要依赖于Servlet API。`javax.servlet.http.Cookie`类用于创建和操作Cookie,而`javax.servlet.http.HttpSession`接口则提供了Session的相关方法。例如,你可以使用`...

    Servlet会话机制(cookie and session)

    本文将深入探讨Cookie和Session两种主要的会话管理方式,并结合一个名为"ShoppingCar"的示例来阐述它们在实际应用中的工作原理。 **一、Cookie** Cookie是由服务器发送到客户端(浏览器)的一小段信息,然后由...

    Cookie与Session的示例代码

    在Web开发中,Cookie和Session是两种非常重要的用户身份管理和会话跟踪技术。它们都是用来在客户端和服务器之间存储和传递信息的方式,但各有特点和适用场景。本篇将通过具体的示例代码来深入理解Cookie和Session的...

Global site tag (gtag.js) - Google Analytics