servlet 学习笔记(三)
同一用户的不同页面共享数据有以下四种方法:
1.sendRedirect()跳转
2.session技术
3.隐藏表单提交(form)
4. cookie技术(小甜饼)
----------------------1.sendRedirect()跳转---------------------------
通过该方法可以将一个页面的信息传送给另外的页面,比如:sendRedirect(“welcome?uname=aaa”);
接收页面采用这种格式接收参数:String u=req.getParameter("uname");
优点:传送信息的速度比较快
缺点:它只能传送字符串,而不能传送一个对象;在地址栏会显示传递的参数,不适合敏感信息的传递。
sendRedirect(“welcome?uname=aaa”);
注意点:
1.welcome代表你要跳转的那个servlet的url
2.servlet url名和变量之间有个?
3.如要传递两个以上的值,它们之间要用符号&分开,比如sendRedirect(“welcome?uname=aaa&passwd=123”);
另一种方式:
String u=req.getParameter("username"); //从其他页面获取参数
String p=req.getParameter("password"); //从其他页面获取参数
res.sendRedirect("wel?uname="+u+"&upassword="+p); //类似于拼接的方式,灵活传递参数
4.如果传递的是中文,那你将得到乱码,需要处理一下res.setContentType(“text/html,charset=gbk”);
5.在接收页面获取用sendRedirect()方式传递的参数:
String name=req.getParameter("uname");
String password=req.getParameter("upassword");
----------------------2.session技术------------------------------------
什么是session?
当用户打开浏览器,访问某个网站时,服务器就会在服务器的内存为该浏览器(特别注意,这边并不是指某台电脑,换句话说,一台电脑上使用双击的方式打开浏览器多会创建不同的session)分配一个空间,该空间被这个浏览器独占。这个空间就是session空间,该空间中的数据默认存在时间为30min,你也可以修改该值。
如上图(a)所示:服务器分配给A、B、C客户端的session空间分别为tomcat服务器中的A、B、C。
如何理解session?如上图(b)所示:
可以把session看做一张表,这张表有两列,而表有多少行理论上没有限制,每一行就是session的一个属性。每个属性包含有两个部分,一个是该属性的名字String,另外一个是它的值Object。
session可以用来做什么?
1.网上商城中的购物车
2.保存登陆用户的信息
3.将某些数据放入到session中,供同一用户的各个方面使用
4.防止用户非法登陆到某个页面
……
如何使用session?
1.得到session,没有就创建session
HttpSession hs=request.getSession(true);
2.向session添加属性
hs.setAttribute(String name,Object val);如:hs.setAttribute("hsname",u);
3.从session得到某个属性
String name=hs.getAttribute(String name);如:String name=(String)hs.getAttribute("hsname");
说明:将类型为Object的属性值强制转换为String类型。
4.从session中删除掉某个属性
hs.removeAttribute(String name);
5.注销session中的内容(比较安全的一种方式),一次性删除所有session的值;
ht.setMaxInactiveInterval(0);
说明:移除指定的session采用这种方式:ht.removeAttribute("name");
session的注意事项:
1.session中属性存在的默认时间是30min,你也可修改它存在的时间:
(a)修改web.xml (以分钟为单位) ,具体操作如下:
打开.... \Tomcat 6.0\conf目录下面的web.xml配置,找到session相关的配置:
....
<!-- ==================== Default Session Configuration ================= -->
<!-- You can set the default session timeout (in minutes) for all newly -->
<!-- created sessions by modifying the value below. -->
<session-config>
<session-timeout>30</session-timeout>
</session-config>
....
说明:这边是以分钟为单位,存活时间30分钟,可以根据需要进行修改。
注意:以上修改是针对tomcat目录下的所有Web应用程序,在实际运用中可以将上面的代码复制到特殊要求的web应用程序的web.xml中并根据实际需要进行配置。
(b)在程序中修改(以秒为单位),如果值为负值,则session永远不超时,具体代码如下:
//得到session
HttpSession hs=req.getSession(true);
//修改session的存在时间,存活时间5秒
hs.setMaxInactiveInterval(5);
2.上面说的这个30min指的是用户的发呆时间,而不是累计时间
3.当某个浏览器访问网站时,服务器会给浏览器分配一个唯一的session id,并以此来区分不同的浏览器(即客户端)
4.因为session的各个属性要占用服务器的内存,因此软件公司都是在迫不得已的情况下才使用
----------------------3.隐藏表单提交(form)---------------------------
隐藏表单
这是最常见的一种方式,也是最简单的,但有时该技巧非常管用,形如:
<form action=login>
<input type=hidden name=id value=b>//传递隐藏信息
<input type=text name=name value=d>//传递显示的信息
</form>
通过隐藏表单,我们也可以将一个页面信息,传递给另外的页
接收页面获取表单提交的信息:
String id=req.getParameter("id");
String id=req.getParameter("name");
----------------------4. cookie技术(小甜饼)----------------------------
什么是cookie?
服务器在客户端保存用户的信息,比如登录名、密码……就是cookie这些信息就像是小甜饼一样,数据量并不大,服务器端在需要的时候可以从客户端读取
cookie可以用来做什么?
1.保存用户名、密码,在一定时间不用重新登录
2.记录用户访问网站的喜好,比如有无背景音乐、网页的背景色是什么
3.网站的个性化,比如定制网站的服务、内容
cookie的工作原理
cookie使用:
1.cookie有点像一张表,分两列,一个是名字,一个是值,数据类型都是String
2.如何创建一个cookie(在服务器端创建的):Cookie c=new Cookie(String name, String val);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //如何创建cookie案例 2 3 package com.tsinghua; 4 5 6 import javax.servlet.http.*; 7 import java.io.*; 8 9 public class CookieTest1 extends HttpServlet{ 10 11 //处理get请求 12 13 public void doGet(HttpServletRequest req,HttpServletResponse res) 14 { 15 16 try { 17 18 res.setContentType("text/html;charset=gbk"); 19 PrintWriter pw=res.getWriter(); 20 //当用户访问该servlet时, 就将信息创建到该用户的cookie中 21 22 //1. 现在服务器端创建一个cookie 23 Cookie myCookie=new Cookie("color1","red"); 24 25 //2. 该cookie存在的时间,如果你不设置存在时间,那么该cookie将不会保存 26 27 myCookie.setMaxAge(30); 28 29 //3. 将该cookie写回到客户端 30 res.addCookie(myCookie); 31 32 pw.println("已经创建了cookie"); 33 } 34 catch (Exception ex) 35 { 36 ex.printStackTrace(); 37 } 38 39 } 40 41 }
3.如何将一个cookie添加到客户端response.addCookie(c);
4.如何读取cookie(从客户端读到服务器)request.getCookie();
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 //如何读取cookie案例 2 3 package com.tsinghua; 4 5 6 import javax.servlet.http.*; 7 import java.io.*; 8 9 public class CookieTest2 extends HttpServlet{ 10 11 //处理get请求 12 13 public void doGet(HttpServletRequest req,HttpServletResponse res){ 14 15 16 try { 17 18 19 res.setContentType("text/html;charset=gbk"); 20 21 PrintWriter pw=res.getWriter(); 22 23 //从客户端得到所有cookie信息 24 Cookie [] allCookies=req.getCookies(); 25 26 int i=0; 27 //如果allCookies不为空... 28 if(allCookies!=null){ 29 30 //从中取出cookie 31 for(i=0;i<allCookies.length;i++){ 32 33 //依次取出 34 Cookie temp=allCookies[i]; 35 36 if(temp.getName().equals("color1")){ 37 38 //得到cookie的值 39 String val=temp.getValue(); 40 41 pw.println ("color1="+val); 42 break; 43 44 } 45 } 46 if(allCookies.length==i){ 47 48 pw.println("cookie 过期"); 49 } 50 51 }else{ 52 pw.println ("不存在color1这个cookie/或是过期了!"); 53 } 54 55 } 56 catch (Exception ex) { 57 58 ex.printStackTrace(); 59 } 60 61 } 62 }
5.删除cookie
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /** 2 * @(#)CookieTest3.java 3 * 4 * 5 * @author 6 * @version 1.00 2013/10/13 7 */ 8 //如何删除cookie案例 9 package com.tsinghua; 10 import javax.servlet.*; 11 import javax.servlet.http.*; 12 import java.io.*; 13 14 public class CookieTest3 extends HttpServlet{ 15 16 public CookieTest3() { 17 } 18 19 // 重写doGet方法 20 // req:用于向客户端(浏览器)获取信息 21 // res:用于向客户端(浏览器)返回信息 22 23 public void doGet(HttpServletRequest req,HttpServletResponse res) 24 { 25 try { 26 res.setContentType("text/html ; charset=gbk "); 27 PrintWriter pw=res.getWriter(); 28 //从客户端得到所有cookie信息 29 Cookie [] allCookies=req.getCookies(); 30 int i=0; 31 //如果allCookies不为空... 32 if(allCookies!=null) 33 { pw.println("allCookies的长度:"+allCookies.length+"<br>"); 34 //从中取出cookie 35 for(i=0;i<allCookies.length;i++) 36 { 37 //依次取出 38 Cookie temp= allCookies[i]; 39 pw.println("allCookies["+i+"]的属性名为:"+allCookies[i].getName()+"属性值为:"+allCookies[i].getValue()+"<br>"); 40 if(temp.getName().equals("color1")) 41 { 42 //得到cookie的值 43 String val=temp.getValue(); 44 pw.println ("已经找到,color1="+val); 45 46 //将该cookie删除 47 temp.setMaxAge(0); 48 // temp.setPath("/"); 这句可不要 49 res.addCookie(temp); 50 pw.println("时间:"+temp.getMaxAge()); 51 // pw.println("删除了color这个cookie"); 52 pw.println ("删除后color1="+temp.getValue()); 53 //上面一句还会输出相应的值,但是通过google浏览器查看(F12—Console—s输入:document.cookie回车—结果为空) 54 // break; 55 } 56 57 } 58 59 } 60 61 } 62 catch (Exception ex) { 63 ex.printStackTrace(); 64 } 65 66 67 } 68 69 // 重写doPost方法 70 // req:用于向客户端(浏览器)获取信息 71 // res:用于向客户端(浏览器)返回信息 72 public void doPost(HttpServletRequest req,HttpServletResponse res) 73 { 74 this.doGet(req,res); 75 } 76 77 }
cookie其它说明
1.可以通过IE——工具——internet选项——隐私——高级来启用或是禁用cookie
2.由于cookie的信息是保存在客户端的,因此安全性不高
3.cookie信息的生命周期可以在创建时设置(比如30s),从创建那一时刻起,就开始计时,到时该cookie的信息就无效了
-------------------------cookie vs session-----------------------------
1.存在的位置
cookie保存在客户端,session保存在服务器端
2.安全性
比较而言,cookie的安全性比session要弱
3.网络传输量
cookie通过网络在客户端与服务器端传输,而session保存在服务器端,不需要传输
--------------------------------------------------------------------------