博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Servlet中Cookie的用法
阅读量:4583 次
发布时间:2019-06-09

本文共 14167 字,大约阅读时间需要 47 分钟。

借用百度百科上的说法,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("");    	out.println("");    	out.println("设置Cookie页面");    	out.println("");    	out.println("");    	out.println("设置Cookie成功!
"); out.println("显示设置的Cookie"); out.println(""); out.println(""); } 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("");    	out.println("");    	out.println("读取Cookie页面");    	out.println("");    	out.println("");    	out.println("
"); out.println("
" + "
" + "
"); } } out.println("
Cookie Name Cookie Value
"); // 读取客户端的所有Cookie Cookie[] cookies = req.getCookies(); if(null != cookies) { Cookie cookie; for(int i = 0; i < cookies.length; i++) { cookie = cookies[i]; out.println("
" + cookie.getName() +" " + cookie.getValue() +"
"); out.println(""); out.println(""); } 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:

testcookie
com.chongqing.TestCookie
testcookie
/test/testcookie
showcookie
com.chongqing.ShowCookie
showcookie
/showcookie

 

最后,是将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("");					pw.println("");										String info = req.getParameter("info");					if(null != info)					{						pw.println("

用户名或者密码错误!

"); } pw.println("

登录界面

"); pw.println("
"); pw.println("用户名:
"); pw.println("密码:
"); pw.println("
两周内不重复登录
"); pw.println("
"); pw.println("
"); pw.println(""); pw.println(""); } 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("
"); 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("
"); pw.println("
"); while(rs.next()){ pw.println("
"); pw.println("
"); pw.println("
"); pw.println("
"); pw.println("
"); pw.println("
"); pw.println("
"); } pw.println("
userID username passwd email grade
"+rs.getInt(1)+" "+rs.getString(2)+" "+rs.getString(3)+" "+rs.getString(4)+" "+rs.getInt(5)+"
"); //显示超链接 if(1 != pageNow){ pw.println("
首页"); } for(int i=1; i<=pageCount; ++i ){ pw.println("
"+i+""); } if(pageCount != pageNow){ pw.println("
尾页"); } pw.println("
"); } 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); } }

  运行结果:

 

 

转载于:https://www.cnblogs.com/yzy-blogs/p/6597323.html

你可能感兴趣的文章
矩阵分解(matrix factorization)
查看>>
大型网站的架构设计与演进
查看>>
‘3 sigma’rule(68–95–99.7 rule)
查看>>
【并发编程】延时初始化
查看>>
编程珠玑--左旋字符串
查看>>
【黑金原创教程】【FPGA那些事儿-驱动篇I 】实验十四:储存模块
查看>>
关于js的几道经典题(作用域、原型链等)自己做的
查看>>
【菜鸟学Python】函数的定义及调用
查看>>
宜信微服务任务执行器
查看>>
POJ 2774 Long Long Message 后缀数组
查看>>
datagrid中设置编辑,删除列是否可以访问
查看>>
Linux下I/O复用 Select与Poll
查看>>
python全栈学习--day10(函数进阶)
查看>>
Android初学第19天
查看>>
Flask框架web开发
查看>>
【linux就该这么学】-08
查看>>
JavaScript基础知识汇总
查看>>
PyQt4网格布局
查看>>
PHP学习笔记 - 进阶篇(3)
查看>>
极角排序那些事
查看>>