zoukankan      html  css  js  c++  java
  • Servlet中Cookie的用法

    借用百度百科上的说法,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);  
        }  
    }  
    

      运行结果:

     


  • 相关阅读:
    Number Clicker CodeForces
    We Need More Bosses CodeForces
    Tree Constructing CodeForces
    Berland and the Shortest Paths CodeForces
    Allowed Letters CodeForces
    Military Problem CodeForces
    FFT自看
    Communication System
    Dollars
    Coin Change
  • 原文地址:https://www.cnblogs.com/yzy-blogs/p/6597323.html
Copyright © 2011-2022 走看看