Servlet中Cookie的用法

来源:互联网 发布:美国经济数据gdp 编辑:程序博客网 时间:2024/05/01 10:18

借用百度百科上的说法,Cookie(有时也用其复数形式Cookies),是指某些网站为了辨别用户身份、进行 session 跟踪而储存在用户本地终端上的数据(通常经过加密)。


因为HTTP协议的无连接性,所以要求出现一种保存C/S间状态的机制,而Cookie就是符合这种要求保存在客户端的文本文件,Cookie是以“名-值”的形式保存数据。


Cookie可用于同一用户的不同页面共享数据,保存用户的用户名、密码在一定时间内不用重新登录和记录用来访问网站的喜好等等。


下面就通过一个例子来更好的理解Cookie,先一个页面设置Cookie,然后在另一个页面读取到COokie并显示。

设置Cookie代码:

/** * @(#)TestCookie.java * *测试servlet中Cookie的用法 * @author  * @version 1.00 2017/2/26 */package com.chongqing;import javax.servlet.http.*;import java.io.*;import javax.servlet.ServletException;public class TestCookie extends HttpServlet {        //处理get请求    public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{    //向客户端写入Cookie,共6个    for(int i = 0; i < 3; ++i)    {    //3个没有设置时间的cookie,属于本窗口及其子窗口    Cookie cookie = new Cookie("Session-Cookie-"+i, "Cookie-value-p"+i);    res.addCookie(cookie);        //三个cookie设置了时间(单位是秒),属于文本,别的窗口也可以访问到这些cookie    cookie = new Cookie("Persisten-Cookie-"+i, "Cookie-Vslue-P"+i);    cookie.setMaxAge(60*60*1); //1小时    res.addCookie(cookie);    }        //显示跳转到ShowCookie的页面    res.setContentType("text/html;charset=gb2312");    PrintWriter out = res.getWriter();        out.println("<html>");    out.println("<head>");    out.println("<title>设置Cookie页面</title>");    out.println("</head>");    out.println("<body>");    out.println("设置Cookie成功!<br/>");    out.println("<a href=showcookie>显示设置的Cookie</a>");    out.println("</body>");    out.println("</html>");}        public void doPost(HttpServletRequest req,HttpServletResponse res)  throws ServletException, IOException{        this.doGet(req,res);    }    }


读取Cookie代码:

/** * @(#)ShowCookie.java * *测试servlet中Cookie的用法 * @author  * @version 1.00 2017/2/26 */package com.chongqing;import javax.servlet.http.*;import java.io.*;import javax.servlet.ServletException;public class ShowCookie extends HttpServlet {        //处理get请求    public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException{    res.setContentType("text/html;charset=gb2312");    PrintWriter out = res.getWriter();        out.println("<html>");    out.println("<head>");    out.println("<title>读取Cookie页面</title>");    out.println("</head>");    out.println("<body>");    out.println("<table border=1 align=center>");    out.println("<TH>Cookie Name<TH>Cookie Value<br>");       // 读取客户端的所有Cookie        Cookie[] cookies = req.getCookies();        if(null != cookies)         {            Cookie cookie;            for(int i = 0; i < cookies.length; i++)             {                cookie = cookies[i];                out.println("<tr>" + "<td>" + cookie.getName() +"</td>"                                          + "<td>" + cookie.getValue() +"</td></tr>");            }        }            out.println("</table>");    out.println("</body>");    out.println("</html>");}        public void doPost(HttpServletRequest req,HttpServletResponse res)  throws ServletException, IOException{        this.doGet(req,res);    }    }


结果:

 

Cookie需要注意的问题:

1、服务器向客户端写入的内容只能是文本内容

2、客户端可以阻止服务器的写入。

3、用户只能读取自己webapp写入的东西。

4、通过setMaxAge可以设置Cookie的保存时间,如果没有设置,则Cookie保存在内存中,关掉窗口Cookie就会消失。

5、一个Servlet/JSP设置的cookie能够被同一个路径或其子路径的Servlet/JSP读取到,但不能被其父路径读取,这里的路径是指URL路径。

比如说如果这样部署web.xml文件,则showCookie不能读取到testCookie设置的Cookie:

 <servlet>    <servlet-name>testcookie</servlet-name>    <servlet-class>com.chongqing.TestCookie</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>testcookie</servlet-name>      <url-pattern>/test/testcookie</url-pattern>  </servlet-mapping>  <servlet>    <servlet-name>showcookie</servlet-name>    <servlet-class>com.chongqing.ShowCookie</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>showcookie</servlet-name>      <url-pattern>/showcookie</url-pattern>  </servlet-mapping>

最后,是将Cookie应用在用户管理系统中,实现两个星期不用重复登录的功能

登录界面代码:

/** * @(#)HelloGen.java * *登录界面 * @author  * @version 1.00 2017/2/23 */package com.chongqing;import javax.servlet.http.*;import java.io.*;public class Login extends HttpServlet {        //处理get请求    public void doGet(HttpServletRequest req,HttpServletResponse res){    //业务逻辑    try {        //中文乱码    res.setContentType("text/html;charset=gbk");PrintWriter pw = res.getWriter();//返回登录界面pw.println("<html>");pw.println("<body>");String info = req.getParameter("info");if(null != info){pw.println("<h1>用户名或者密码错误!</h1><br/>");}pw.println("<h1>登录界面</h1>");pw.println("<form action= logincl method=post>");pw.println("用户名:<input type=text name=username><br>");pw.println("密码:<input type=password name=passwd><br>");pw.println("<input type=checkbox name=keep value=2>两周内不重复登录<br> ");pw.println("<input type=submit value=login><br>");pw.println("</form>");pw.println("</body>");pw.println("</html>");}catch (Exception ex) {ex.printStackTrace();}    }        public void doPost(HttpServletRequest req,HttpServletResponse res){        this.doGet(req,res);    }}

登录验证代码:

package com.chongqing;    import javax.servlet.http.*;  import java.io.*;  import java.sql.*;  public class LoginCl extends HttpServlet {            //处理get请求      public void doGet(HttpServletRequest req,HttpServletResponse res){                      Connection ct = null;         PreparedStatement ps = null;          ResultSet rs = null;                        //业务逻辑              try {                  //接收用户名和密码                  String u = req.getParameter("username");                  String p = req.getParameter("passwd");                                  Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");                ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TestServlet","sa","123456");              ps = ct.prepareStatement("select * from users where username = ? and passwd = ?");              ps.setString(1,u);            ps.setString(2,p);        rs = ps.executeQuery();                     if(rs.next()){                                //合法用户                                String keep = req.getParameter("keep");                                if(null != keep){                                //将用户名和密码通过Cookie保存到客户端                //创建Cookie                Cookie name = new Cookie("myname",u);                Cookie passwd = new Cookie("passwd",p);                                //设置时间,保存两周                name.setMaxAge(2*7*24*3600);                passwd.setMaxAge(2*7*24*3600);                                //回写到客户端                res.addCookie(name);                res.addCookie(passwd);                                      }                                                 //添加Session并跳转到欢迎界面                      HttpSession mySession = req.getSession(true);                      mySession.setMaxInactiveInterval(60*10);                   //指定Session存活的时间,单位是秒                      mySession.setAttribute("usname",u);                       //在Session中添加一个属性                                            res.sendRedirect("wel");//转到wel界面                        }else{                                                 //不合法                       res.sendRedirect("login");//返回login界面                      }                                         /*                    //验证                  if(u.equals("zero")&&p.equals("123")){                                            //合法,添加Session并跳转到欢迎界面                      HttpSession mySession = req.getSession(true);                      mySession.setMaxInactiveInterval(30);                   //指定Session存活的时间,单位是秒                      mySession.setAttribute("usname",u);                       //在Session中添加一个属性                                            res.sendRedirect("wel");//写你要到的Servlet的URL                                            }else{                                                    //不合法                          res.sendRedirect("login");//写你要到的Servlet的URL                      }                    */              }              catch (Exception ex) {                  ex.printStackTrace();              }finally{              //关闭资源!!!              //关闭顺序是,谁后创建谁先关闭                            try {                  if(null != rs){                      rs.close();                  }                  if(null != ps){                      ps.close();                  }                  if(null != ct){                      ct.close();                  }              } catch (SQLException e) {                  // TODO: handle exception                  e.printStackTrace();              }         }          }                public void doPost(HttpServletRequest req,HttpServletResponse res){                    this.doGet(req,res);      }  }  

欢迎界面代码:

package com.chongqing;    import javax.servlet.http.*;  import java.io.*;  import java.sql.*;  public class wel extends HttpServlet {            //处理get请求      public void doGet(HttpServletRequest req,HttpServletResponse res){                      Connection ct = null;         PreparedStatement ps = null;          ResultSet rs = null;                        //首先判断Session中是否有登录时添加的属性              HttpSession mySession = req.getSession(true);                            String val = (String)mySession.getAttribute("usname");                            try {                          if(null == val){                      //如果session中没有用户信息,再看看Cookie中有没有                    String name = null;                    String passwd = null;                                        //从客户端获得所有Cookie                    Cookie[] allCookies = req.getCookies();                    if(null != allCookies){                    for(int i=0; i < allCookies.length; ++i){                    //依次取出Cookie                    Cookie myCookie = allCookies[i];                                        if(myCookie.getName().equals("myname")){                    //得到Cookie的值                    name = myCookie.getValue();                    }else if(myCookie.getName().equals("passwd")){                                        passwd = myCookie.getValue();                    }                                        }                                                            //如果用户名和密码都不为空                    if(!name.equals("")&&!passwd.equals("")){                    //到loginCl中进行验证是否用户名和密码合法                    res.sendRedirect("logincl?username="+name+"&passwd="+passwd);                    return;                    }                                             }                                            //返回登录界面                          res.sendRedirect("login?info=error");                          return;                      }                           //中文乱码                      res.setContentType("text/html;charset=gbk");                      PrintWriter pw = res.getWriter();                                          //把所有内容放在中间                    pw.println("<body><center>");                    pw.println("Welcom!");                                          //分页的功能                    int pageSize = 3;   //每页显示3条记录                    int pageNow = 1;   //首先显示第一页的内容                    int pageCount = 0; //一共有多少页(通过计算获得)                    int rowCount = 0;  //一共有多少行记录(通过查表获得)                                     //动态的接收pageNow                    String sPageNow = req.getParameter("pageNow");                                        if(null != sPageNow){                                        pageNow = Integer.parseInt(sPageNow);                    }                                        //连接数据库                   Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");                ct = DriverManager.getConnection("jdbc:sqlserver://127.0.0.1:1433;DatabaseName=TestServlet","sa","123456");              ps = ct.prepareStatement("select count(*) from users");         rs = ps.executeQuery();                     if(rs.next()){                rowCount = rs.getInt(1);//获得rowCount的值                }                                //计算pageCount的值                if(rowCount%pageSize == 0){      pageCount = rowCount/pageSize;  }else{      pageCount = rowCount/pageSize + 1;  }  ps = ct.prepareStatement("select top "+pageSize+" *  from users where userID not in (select top "+pageSize*(pageNow-1)+" userID from users)");          //ps.setInt(1,pageSize);   //不能采用对问号赋值的方式          //ps.setInt(2,pageSize*(pageNow-1));          rs = ps.executeQuery();      //用表格显示用户的信息 pw.println("<table border = 1>"); pw.println("<tr><td>userID</td><td>username</td><td>passwd</td><td>email</td><td>grade</td></tr>");                while(rs.next()){                pw.println("<tr>");                pw.println("<td>"+rs.getInt(1)+"</td>");                pw.println("<td>"+rs.getString(2)+"</td>");                pw.println("<td>"+rs.getString(3)+"</td>");                pw.println("<td>"+rs.getString(4)+"</td>");                pw.println("<td>"+rs.getInt(5)+"</td>");                pw.println("</tr>");                }                pw.println("</table>");                    //显示超链接           if(1 != pageNow){          pw.println("<a href=wel?pageNow="+1+">首页</a>");          }                    for(int i=1; i<=pageCount; ++i ){                    pw.println("<a href=wel?pageNow="+i+">"+i+"</a>");          }                    if(pageCount != pageNow){          pw.println("<a href=wel?pageNow="+pageCount+">尾页</a>");          }                    pw.println("</body></center>");                      }              catch (Exception ex) {                  ex.printStackTrace();              }finally{              //关闭资源!!!              //关闭顺序是,谁后创建谁先关闭                            try {                  if(null != rs){                      rs.close();                  }                  if(null != ps){                      ps.close();                  }                  if(null != ct){                      ct.close();                  }              } catch (SQLException e) {                  // TODO: handle exception                  e.printStackTrace();              }         }            }                public void doPost(HttpServletRequest req,HttpServletResponse res){                    this.doGet(req,res);      }  }  

运行结果:



0 0