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);

   

 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 }
View Code

  

3.如何将一个cookie添加到客户端response.addCookie(c);

 

 4.如何读取cookie(从客户端读到服务器)request.getCookie();

   

 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 }
View Code

 

5.删除cookie

 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 }
View Code

 

cookie其它说明

1.可以通过IE——工具——internet选项——隐私——高级来启用或是禁用cookie

2.由于cookie的信息是保存在客户端的,因此安全性不高

3.cookie信息的生命周期可以在创建时设置(比如30s),从创建那一时刻起,就开始计时,到时该cookie的信息就无效了

-------------------------cookie vs session-----------------------------

1.存在的位置

cookie保存在客户端,session保存在服务器端

2.安全性

比较而言,cookie的安全性比session要弱

3.网络传输量

cookie通过网络在客户端与服务器端传输,而session保存在服务器端,不需要传输

 --------------------------------------------------------------------------

源代码下载点我

posted @ 2013-10-11 11:56  博客园逛逛  阅读(328)  评论(0编辑  收藏  举报