(第5讲)同一用户的不同页面共享数据的四种方法
2016-08-30 11:39
483 查看
同一用户的不同页面共享数据的四种方法
1、cookie
2、sendRedirect
3、session
4、隐藏表单提交
1、cookie
服务器在客户端保存的用户信息,比如登录名,密码等就是cookie。
cookie作用:
(1)保存用户名、密码,在一定时间不用重复登录
(2)记录用户访问网站的喜好(比如有无背景音乐、网页背景色是什么)
(3)网站的个性化,比如定制网站的服务、内容
cookie 和 servlet一样,内部的数据结构是散列表。
cookie的使用:
(1)cookie的创建(在服务器创建):Cookie c = new Cookie(String name,String val);
(2)将一个cookie对象添加到客户端:response.addCookie(c);
(3)从客户端读取cookie到服务器:request.getCookies();
cookie的其他说明:
(1)可以通过IE--工具--Internet选项--隐私--高级:来启用或者禁用cookie
(2)由于cookie的信息是保存在客户端的,因此安全性不高
(3)cookie信息的生命周期可以在创建时设置(比如30s),从创建的那一刻起,就开始计时,
30s后cookie信息就无效了。
例子:在cookie1页面:创建并显示cookie信息
在cookie2页面:保存cookie信息并显示
在cookie3页面:删除cookie信息
程序如下:
-----------------------------------------------------------------------------------------------------------------------------------
/**
*新建cookie
*/
package com.weiya;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Cookie1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//当用户访问该页面时,就将信息创建到该用户的cookie中
//1、先在服务器端创建一个cookie
Cookie cookie = new Cookie("color1","red");
//2、设置该cookie存在的时间
cookie.setMaxAge(30);
//3、将该cookie写到客户端
res.addCookie(cookie);
pw.println("已经创建了cookie");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
--------------------------------------------------------------------------------------------------------------------------
/**
* 读取cookie
*/
package com.weiya;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Cookie2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从客户端得到所有cookie信息
Cookie[] cookie = req.getCookies();
int i=0;
if(cookie!=null){//如果cookie不为空,从中读取cookie
for(i=0;i<cookie.length;i++){
Cookie tem = cookie[i];
if(tem.getName().equals("color1")){
String val = tem.getValue();
pw.println("color1="+val);
break;
}
}
if(cookie.length==i)
{
pw.println("cookie过期" );
}
}else{
pw.println("不存在color这个cookie/或是已经过期了");
}
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
----------------------------------------------------------------------------------------------------------------------
/**
* 删除cookie
*/
package com.weiya;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Cookie3 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从客户端得到所有cookie信息
Cookie[] cookie = req.getCookies();
int i=0;
if(cookie!=null){//如果cookie不为空,从中读取cookie
for(i=0;i<cookie.length;i++){
Cookie tem = cookie[i];
if(tem.getName().equals("color1")){
tem.setMaxAge(0); //将该coolie删除
pw.println("已经删除了color1这个cookie");
break;
}
}
if(cookie.length==i)
{
pw.println("cookie过期" );
}
}else{
pw.println("不存在color这个cookie/或是已经过期了");
}
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
----------------------------------------------------------------------------------------------------------------------
部署文件如下:
<!--cookie开始-->
<servlet>
<servlet-name>Cookie1</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Cookie1</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Cookie1</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/cookie1</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<servlet>
<servlet-name>Cookie2</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Cookie2</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Cookie2</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/cookie2</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<servlet>
<servlet-name>Cookie3</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Cookie3</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Cookie3</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/cookie3</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--cookie结束-->
----------------------------------------------------------------------------------------------------------------------
结果就是:
在网站中输入:http://localhost:8080/myWebSite/cookie1,可以看到浏览器输出:
已经创建了cookie
在网站中输入: http://localhost:8080/myWebSite/cookie3,可以看到浏览器输出:
color1=red(如果在30秒后刷新该页面,会显示:不存在color这个cookie/或是已经过期了)
在网站中输入: http://localhost:8080/myWebSite/cookie3,可以看到浏览器输出:
已经删除了color1这个cookie
2、HttpServletResponse类型对象的sendRedirect(String location)方法
只能传递字符串,不能传递对象,但是速度快;
用的时候需要注意:比如说 response.sendRedirect("welcome?uname=weiya");
(1)welcome代表你要跳转的那个Servlet的URL
(2)Servlet URL名 和 变量之间需要有 ?
(3)如果需要传递两个以上的值,他们之间需要用地址符 & 分开,比如:
response.sendRedirect("welcome?uname=weiya&passw=12");
(4)如果传递的是中文,可能是乱码,需要处理
例子:
———————————————————————————————————————
/**
* 登录界面
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
//解决乱码问题,只要把编码方式改一下就行
public class Login extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<h1>登录界面</h1>");
pw.print("<form action=loginc method=post>");//action后边写URL
pw.print("用户名:<input type=text name=uname><br>");
pw.print(" </input ><br>");
pw.print("密码:<input type=password name=pword><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
————————————————————————————————————————
/**
* 用户验证Servlet
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class LoginC extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req, HttpServletResponse res){
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
//得到用户提交的用户名和密码,用req
//接收用户名和密码
String u = req.getParameter("uname");
String p = req.getParameter("pword");
if(u.equals("admin") && p.equals("123")){
res.sendRedirect("wel?uname="+u+"&upass="+p) ;
}
}else{ //不合法。跳转到登录界面
res.sendRedirect("login") ;
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
——————————————————————————————————————————
/**
* 欢迎界面
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Wel extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
//得到从LoginC中传过来的信息
String u = req.getParameter("uname");
String p = req.getParameter("upass");
//这里的名字不能写错,要与loginC中传递参数一致
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
pw.print("欢迎 " +u+" pass="+p);
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
结果就是:
在网站中访问:http://localhost:8080/myWebSite/login,可以看到浏览器输出:
登录界面
用户名:
密码:
提交
输入正确的用户名和密码,点击提交,浏览器显示:(欢迎界面)
欢迎,admin,pass=123
如果输入不正确的用户名和密码,点击提交,浏览器显示:(login界面)
登录界面
用户名:
密码:
提交
3、session
session的用法,即HttpSession类型的用法
(1)得到一个会话对象:HttpSession hs = request.getSession(true);
(2)给会话对象添加属性:hs.setAttribute(String name,Object val);
(3)得到某个属性:String name = hs.getAttribute(String name);
(4)删除某个属性:hs.removeAttribute(String name);
(5)得到服务器分配给该会话的ID:String id = hs.getId();
(6)删除全部的会话属性:hs.setMaxInactiveInterval(0);这个方法可以用来安全注销,是最安全的
[b]实现会话跟踪但是只能实现一次请求
[/b]
先看一个例子:
session1:提交信息给session2,这是第一次请求,form中的method=post
session2:提交信息给session3,这是第二次请求,请求方式为get(超链接)
程序如下:
——————————————————————————————————————————
* 1、提交信息给session2
*2、第一次请求
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Session1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<form action=session2 method=post>");//action后边写URL
pw.print("想说的话:<input type=text name=msg><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
————————————————————————————————————————
* 1、提交信息给session3
*2、第二次请求
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Session2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到想说的话
String msg = req.getParameter("msg");
pw.println("想说的话:"+msg);
HttpSession hs = req.getSession(true);////输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
//转到session3
pw.println("<a href=\"session3\">连接到session3</a>");
}catch(Exception e){
e.printStackTrace();
}
}
}
—————————————————————————————————————————
* 1、获得与当前请求相关联的会话
*2、显示ID
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Session3 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到想说的话
String msg = req.getParameter("msg");
pw.println("想说的话:"+msg);
HttpSession hs = req.getSession(true);////输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
}catch(Exception e){
e.printStackTrace();
}
}
}
————————————————————————————————————————
部署文件如下:
<!--session1开始-->
<servlet>
<servlet-name>Session1</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Session1</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Session1</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/session1</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--结束-->
<!--开始-->
<servlet>
<servlet-name>Session2</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Session2</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Session2</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/session2</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--结束-->
<!--开始-->
<servlet>
<servlet-name>Session3</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Session3</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Session3</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/session3</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--session3结束-->
在网站中访问:http://localhost:8080/myWebSite/session1,可以看到浏览器输出:
想说的话:
填写要写的话,点击提交,浏览器显示:
想说的话:i love you 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA 连接到session3
点击链接到session3,浏览器显示:
想说的话:null 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA
由此可以得出:
两次输出的ID相同,证明是同一客户,HttpSession对象顺利实现会话跟踪任务;(不论请求是post还是get,都可以实现会话跟踪)
但是两次取得并输出客户提交的信息过程中,第一次顺利取出,第二次却为null,验证了Http协议是一个“无状态”的协议,无法跨过多个请求。
现在考虑如何实现多个请求
index1: 输出一个画面,提交信息给index2,
index2:1、往会话对象中存入信息;2、提交信息给index3,
index3: 1、读取会话对象中已经存入的信息;2、提交信息给index4
index4:1、移除会话对象中已经存入的信息,并检验
程序如下:
———————————————————————————————————————
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<form action=index2 method=post>");//action后边写URL
pw.print("想说的话:<input type=text name=msg><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
———————————————————————————————————————
* 1、将index1提交的信息传给index2,
*2、在index2中练习如何使用在会话对象中存入信息
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到想说的话
String msg = req.getParameter("msg");
pw.println("想说的话:"+msg);
//在会话对象中存入信息
HttpSession hs = req.getSession(true);//得到session
hs.setAttribute("msg",msg);//将得到的信息存入会话对象中
//输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
//转到index3
pw.println("<a href=\"index3\">连接到index3</a>");
}catch(Exception e){
e.printStackTrace();
}
}
}
———————————————————————————————————————
/**
* 1、index2将信息提交给index3
*2、在index3中练习如何去除会话对象中存入的信息
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index3 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从会话对象中读取信息,并输出
HttpSession hs = req.getSession(true);//得到session
String msg = (String)hs.getAttribute("msg");//读取信息
pw.println("想说:"+msg);
//输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
//转到index4
pw.println("<a href=\"index4\">连接到index4</a>");
}catch(Exception e){
e.printStackTrace();
}
}
}
————————————————————————————————————————
/**
* 1、index3将信息提交给index4
*2、在index4中练习如何移除会话对象中存入的信息
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index4 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从会话对象中移除信息,并输出查看是否移除
HttpSession hs = req.getSession(true);//得到session
hs.removeAttribute("msg");//移除信息
String msg = (String)hs.getAttribute("msg");//读取信息
pw.println("想说:"+msg);
//输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
}catch(Exception e){
e.printStackTrace();
}
}
}
在网站中访问:http://localhost:8080/myWebSite/index1,可以看到浏览器输出:
想说的话:
填写要写的话,点击提交,浏览器显示:
想说的话:i love you 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA 连接到index3
点击链接到index3,浏览器显示:
想说:i love you 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA 连接到index4
点击链接到index4,浏览器显示:
想说:null
会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA
由此可以得出:
1、三次输出的ID相同,证明是同一客户,是同一个HttpSession对象。
2、HttpSession对象的 setAttribute(String name ,Object value); 方法可以在会话对象中存入数据;
3、HttpSession对象的 getAttribute(String name); 方法可以在会话对象中读出数据;
4、HttpSession对象的 removeAttribute(String name); 方法可以在会话对象中移除数据;
5、HttpSession对象可以跨越多个请求,在会话对象被销毁之前,只要信息没有被移除,那么存放在会话对象中的数据就可以被同一客户的多个请求所共享。
cookie 和 servlet 的区别:
(1)存在的位置
cookie保存在客户端,session保存在服务器端
(2)安全性
比较而言,cookie的安全性比session要弱一点
(3)网络传输量
cookie通过网络在客户端与服务器端传输;
而session保存在服务器端,不需要传输。
(4)生命周期(以20分钟为例)
cookie 的生命周期是累计的,从创建开始计时,20mins后cookie的生命周期结束,cookie就无效了;
session的生命周期是间隔的,从创建开始计时,如果在20mins内,没有访问过session,则session信息无效;
但是如果在20mins内,访问过session ,那么他的生命周期就重新计算。
除此之外,关机会造成session生命周期结束,但是对cookie没有任何影响。
4、隐藏表单提交
<form action=...>
<input type=hidden name=a value=b></input>
</form>
例子:
HiddenForm1: 输出一个画面,提交信息给hiddenform2,
HiddenForm2:在hiddenform2页面 显示hiddenform1页面提交的信息
——————————————————————————————————————————————————————————
/**
* 隐藏表单的提交页面
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class HiddenForm1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
String test = "abc";
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<h1>登录界面</h1>");
pw.print("<form action=hiddenform2 method=post>");//action后边写URL
pw.print("用户名:<input type=text name=uname><br>");
pw.print(" </input ><br>");
pw.print("密码:<input type=password name=pword><br>");
pw.print(" </input ><br>");
// pw.print(" <input type=hidden name=sex value=test><br>");
pw.print(" <input type=hidden name=sex value="+test+"><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
——————————————————————————————————————————————————————————
/**
* 隐藏表单的接收页面
*/
package com.weiya;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class HiddenForm2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到用户名、密码和隐藏的性别
String u = req.getParameter("uname");
String p = req.getParameter("pword");
String sex = req.getParameter("sex");
pw.println("用户名:"+u);
pw.println("密码:"+p);
pw.println("性别:"+sex);
}catch(Exception e){
e.printStackTrace();
}
}
}
在网站中访问:http://localhost:8080/myWebSite/hiddenform1,可以看到浏览器输出:
密码:
填写之后,点击提交,浏览器显示:
用户名:weiya 密码:1234 性别:abc
1、cookie
2、sendRedirect
3、session
4、隐藏表单提交
1、cookie
服务器在客户端保存的用户信息,比如登录名,密码等就是cookie。
cookie作用:
(1)保存用户名、密码,在一定时间不用重复登录
(2)记录用户访问网站的喜好(比如有无背景音乐、网页背景色是什么)
(3)网站的个性化,比如定制网站的服务、内容
cookie 和 servlet一样,内部的数据结构是散列表。
cookie的使用:
(1)cookie的创建(在服务器创建):Cookie c = new Cookie(String name,String val);
(2)将一个cookie对象添加到客户端:response.addCookie(c);
(3)从客户端读取cookie到服务器:request.getCookies();
cookie的其他说明:
(1)可以通过IE--工具--Internet选项--隐私--高级:来启用或者禁用cookie
(2)由于cookie的信息是保存在客户端的,因此安全性不高
(3)cookie信息的生命周期可以在创建时设置(比如30s),从创建的那一刻起,就开始计时,
30s后cookie信息就无效了。
例子:在cookie1页面:创建并显示cookie信息
在cookie2页面:保存cookie信息并显示
在cookie3页面:删除cookie信息
程序如下:
-----------------------------------------------------------------------------------------------------------------------------------
/**
*新建cookie
*/
package com.weiya;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Cookie1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//当用户访问该页面时,就将信息创建到该用户的cookie中
//1、先在服务器端创建一个cookie
Cookie cookie = new Cookie("color1","red");
//2、设置该cookie存在的时间
cookie.setMaxAge(30);
//3、将该cookie写到客户端
res.addCookie(cookie);
pw.println("已经创建了cookie");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
--------------------------------------------------------------------------------------------------------------------------
/**
* 读取cookie
*/
package com.weiya;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Cookie2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从客户端得到所有cookie信息
Cookie[] cookie = req.getCookies();
int i=0;
if(cookie!=null){//如果cookie不为空,从中读取cookie
for(i=0;i<cookie.length;i++){
Cookie tem = cookie[i];
if(tem.getName().equals("color1")){
String val = tem.getValue();
pw.println("color1="+val);
break;
}
}
if(cookie.length==i)
{
pw.println("cookie过期" );
}
}else{
pw.println("不存在color这个cookie/或是已经过期了");
}
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
----------------------------------------------------------------------------------------------------------------------
/**
* 删除cookie
*/
package com.weiya;
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class Cookie3 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从客户端得到所有cookie信息
Cookie[] cookie = req.getCookies();
int i=0;
if(cookie!=null){//如果cookie不为空,从中读取cookie
for(i=0;i<cookie.length;i++){
Cookie tem = cookie[i];
if(tem.getName().equals("color1")){
tem.setMaxAge(0); //将该coolie删除
pw.println("已经删除了color1这个cookie");
break;
}
}
if(cookie.length==i)
{
pw.println("cookie过期" );
}
}else{
pw.println("不存在color这个cookie/或是已经过期了");
}
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
----------------------------------------------------------------------------------------------------------------------
部署文件如下:
<!--cookie开始-->
<servlet>
<servlet-name>Cookie1</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Cookie1</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Cookie1</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/cookie1</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<servlet>
<servlet-name>Cookie2</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Cookie2</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Cookie2</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/cookie2</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<servlet>
<servlet-name>Cookie3</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Cookie3</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Cookie3</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/cookie3</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--cookie结束-->
----------------------------------------------------------------------------------------------------------------------
结果就是:
在网站中输入:http://localhost:8080/myWebSite/cookie1,可以看到浏览器输出:
已经创建了cookie
在网站中输入: http://localhost:8080/myWebSite/cookie3,可以看到浏览器输出:
color1=red(如果在30秒后刷新该页面,会显示:不存在color这个cookie/或是已经过期了)
在网站中输入: http://localhost:8080/myWebSite/cookie3,可以看到浏览器输出:
已经删除了color1这个cookie
2、HttpServletResponse类型对象的sendRedirect(String location)方法
只能传递字符串,不能传递对象,但是速度快;
用的时候需要注意:比如说 response.sendRedirect("welcome?uname=weiya");
(1)welcome代表你要跳转的那个Servlet的URL
(2)Servlet URL名 和 变量之间需要有 ?
(3)如果需要传递两个以上的值,他们之间需要用地址符 & 分开,比如:
response.sendRedirect("welcome?uname=weiya&passw=12");
(4)如果传递的是中文,可能是乱码,需要处理
例子:
———————————————————————————————————————
/**
* 登录界面
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
//解决乱码问题,只要把编码方式改一下就行
public class Login extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<h1>登录界面</h1>");
pw.print("<form action=loginc method=post>");//action后边写URL
pw.print("用户名:<input type=text name=uname><br>");
pw.print(" </input ><br>");
pw.print("密码:<input type=password name=pword><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
————————————————————————————————————————
/**
* 用户验证Servlet
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;
public class LoginC extends HttpServlet{
public void doGet(HttpServletRequest req, HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req, HttpServletResponse res){
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
//得到用户提交的用户名和密码,用req
//接收用户名和密码
String u = req.getParameter("uname");
String p = req.getParameter("pword");
if(u.equals("admin") && p.equals("123")){
res.sendRedirect("wel?uname="+u+"&upass="+p) ;
}
}else{ //不合法。跳转到登录界面
res.sendRedirect("login") ;
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
——————————————————————————————————————————
/**
* 欢迎界面
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Wel extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
//得到从LoginC中传过来的信息
String u = req.getParameter("uname");
String p = req.getParameter("upass");
//这里的名字不能写错,要与loginC中传递参数一致
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
pw.print("欢迎 " +u+" pass="+p);
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
this.doGet(req,res);
}
}
结果就是:
在网站中访问:http://localhost:8080/myWebSite/login,可以看到浏览器输出:
登录界面
用户名:
密码:
提交
输入正确的用户名和密码,点击提交,浏览器显示:(欢迎界面)
欢迎,admin,pass=123
如果输入不正确的用户名和密码,点击提交,浏览器显示:(login界面)
登录界面
用户名:
密码:
提交
3、session
session的用法,即HttpSession类型的用法
(1)得到一个会话对象:HttpSession hs = request.getSession(true);
(2)给会话对象添加属性:hs.setAttribute(String name,Object val);
(3)得到某个属性:String name = hs.getAttribute(String name);
(4)删除某个属性:hs.removeAttribute(String name);
(5)得到服务器分配给该会话的ID:String id = hs.getId();
(6)删除全部的会话属性:hs.setMaxInactiveInterval(0);这个方法可以用来安全注销,是最安全的
[b]实现会话跟踪但是只能实现一次请求
[/b]
先看一个例子:
session1:提交信息给session2,这是第一次请求,form中的method=post
session2:提交信息给session3,这是第二次请求,请求方式为get(超链接)
程序如下:
——————————————————————————————————————————
* 1、提交信息给session2
*2、第一次请求
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Session1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<form action=session2 method=post>");//action后边写URL
pw.print("想说的话:<input type=text name=msg><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
————————————————————————————————————————
* 1、提交信息给session3
*2、第二次请求
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Session2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到想说的话
String msg = req.getParameter("msg");
pw.println("想说的话:"+msg);
HttpSession hs = req.getSession(true);////输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
//转到session3
pw.println("<a href=\"session3\">连接到session3</a>");
}catch(Exception e){
e.printStackTrace();
}
}
}
—————————————————————————————————————————
* 1、获得与当前请求相关联的会话
*2、显示ID
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Session3 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到想说的话
String msg = req.getParameter("msg");
pw.println("想说的话:"+msg);
HttpSession hs = req.getSession(true);////输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
}catch(Exception e){
e.printStackTrace();
}
}
}
————————————————————————————————————————
部署文件如下:
<!--session1开始-->
<servlet>
<servlet-name>Session1</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Session1</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Session1</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/session1</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--结束-->
<!--开始-->
<servlet>
<servlet-name>Session2</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Session2</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Session2</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/session2</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--结束-->
<!--开始-->
<servlet>
<servlet-name>Session3</servlet-name> <!--给你的servlet取名字,名字是任意的,且不是必须的-->
<servlet-class>com.weiya.Session3</servlet-class> <!-- 指明servlet路径,即包名+类名-->
</servlet>
<servlet-mapping>
<servlet-name>Session3</servlet-name> <!-- 与上边的映射,复制下来-->
<url-pattern>/session3</url-pattern> <!-- 这是在浏览器中输入的访问该servlet的URL-->
</servlet-mapping>
<!--session3结束-->
在网站中访问:http://localhost:8080/myWebSite/session1,可以看到浏览器输出:
想说的话:
填写要写的话,点击提交,浏览器显示:
想说的话:i love you 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA 连接到session3
点击链接到session3,浏览器显示:
想说的话:null 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA
由此可以得出:
两次输出的ID相同,证明是同一客户,HttpSession对象顺利实现会话跟踪任务;(不论请求是post还是get,都可以实现会话跟踪)
但是两次取得并输出客户提交的信息过程中,第一次顺利取出,第二次却为null,验证了Http协议是一个“无状态”的协议,无法跨过多个请求。
现在考虑如何实现多个请求
index1: 输出一个画面,提交信息给index2,
index2:1、往会话对象中存入信息;2、提交信息给index3,
index3: 1、读取会话对象中已经存入的信息;2、提交信息给index4
index4:1、移除会话对象中已经存入的信息,并检验
程序如下:
———————————————————————————————————————
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
//解决中文乱码,解决方法一
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<form action=index2 method=post>");//action后边写URL
pw.print("想说的话:<input type=text name=msg><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
———————————————————————————————————————
* 1、将index1提交的信息传给index2,
*2、在index2中练习如何使用在会话对象中存入信息
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到想说的话
String msg = req.getParameter("msg");
pw.println("想说的话:"+msg);
//在会话对象中存入信息
HttpSession hs = req.getSession(true);//得到session
hs.setAttribute("msg",msg);//将得到的信息存入会话对象中
//输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
//转到index3
pw.println("<a href=\"index3\">连接到index3</a>");
}catch(Exception e){
e.printStackTrace();
}
}
}
———————————————————————————————————————
/**
* 1、index2将信息提交给index3
*2、在index3中练习如何去除会话对象中存入的信息
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index3 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从会话对象中读取信息,并输出
HttpSession hs = req.getSession(true);//得到session
String msg = (String)hs.getAttribute("msg");//读取信息
pw.println("想说:"+msg);
//输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
//转到index4
pw.println("<a href=\"index4\">连接到index4</a>");
}catch(Exception e){
e.printStackTrace();
}
}
}
————————————————————————————————————————
/**
* 1、index3将信息提交给index4
*2、在index4中练习如何移除会话对象中存入的信息
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class Index4 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//从会话对象中移除信息,并输出查看是否移除
HttpSession hs = req.getSession(true);//得到session
hs.removeAttribute("msg");//移除信息
String msg = (String)hs.getAttribute("msg");//读取信息
pw.println("想说:"+msg);
//输出ID,看每个页面的ID是否一样,判断是否为一个用户
String sessionId = hs.getId();
pw.println("会话ID:"+sessionId);
}catch(Exception e){
e.printStackTrace();
}
}
}
在网站中访问:http://localhost:8080/myWebSite/index1,可以看到浏览器输出:
想说的话:
填写要写的话,点击提交,浏览器显示:
想说的话:i love you 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA 连接到index3
点击链接到index3,浏览器显示:
想说:i love you 会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA 连接到index4
点击链接到index4,浏览器显示:
想说:null
会话ID:41B2F61F0FFE3BC2034FABF5A1698EAA
由此可以得出:
1、三次输出的ID相同,证明是同一客户,是同一个HttpSession对象。
2、HttpSession对象的 setAttribute(String name ,Object value); 方法可以在会话对象中存入数据;
3、HttpSession对象的 getAttribute(String name); 方法可以在会话对象中读出数据;
4、HttpSession对象的 removeAttribute(String name); 方法可以在会话对象中移除数据;
5、HttpSession对象可以跨越多个请求,在会话对象被销毁之前,只要信息没有被移除,那么存放在会话对象中的数据就可以被同一客户的多个请求所共享。
cookie 和 servlet 的区别:
(1)存在的位置
cookie保存在客户端,session保存在服务器端
(2)安全性
比较而言,cookie的安全性比session要弱一点
(3)网络传输量
cookie通过网络在客户端与服务器端传输;
而session保存在服务器端,不需要传输。
(4)生命周期(以20分钟为例)
cookie 的生命周期是累计的,从创建开始计时,20mins后cookie的生命周期结束,cookie就无效了;
session的生命周期是间隔的,从创建开始计时,如果在20mins内,没有访问过session,则session信息无效;
但是如果在20mins内,访问过session ,那么他的生命周期就重新计算。
除此之外,关机会造成session生命周期结束,但是对cookie没有任何影响。
4、隐藏表单提交
<form action=...>
<input type=hidden name=a value=b></input>
</form>
例子:
HiddenForm1: 输出一个画面,提交信息给hiddenform2,
HiddenForm2:在hiddenform2页面 显示hiddenform1页面提交的信息
——————————————————————————————————————————————————————————
/**
* 隐藏表单的提交页面
*/
package com.weiya;
import javax.servlet.http.*;
import java.io.*;
public class HiddenForm1 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res)
{
try{
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
String test = "abc";
//返回登录界面
pw.print("<html>");
pw.print("<body>");
pw.print("<h1>登录界面</h1>");
pw.print("<form action=hiddenform2 method=post>");//action后边写URL
pw.print("用户名:<input type=text name=uname><br>");
pw.print(" </input ><br>");
pw.print("密码:<input type=password name=pword><br>");
pw.print(" </input ><br>");
// pw.print(" <input type=hidden name=sex value=test><br>");
pw.print(" <input type=hidden name=sex value="+test+"><br>");
pw.print(" </input ><br>");
pw.print(" <input type=submit value= 提交><br>");
pw.print(" </input ><br>");
pw.print("</form>");
pw.print("</body>");
pw.print("</html>");
}catch(Exception e){
e.printStackTrace();
}
}
public void doPost(HttpServletRequest req,HttpServletResponse res)
{
this.doGet(req,res);
}
}
——————————————————————————————————————————————————————————
/**
* 隐藏表单的接收页面
*/
package com.weiya;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
public class HiddenForm2 extends HttpServlet{
public void doGet(HttpServletRequest req,HttpServletResponse res){
this.doPost(req,res);
}
public void doPost(HttpServletRequest req,HttpServletResponse res){
try{
req.setCharacterEncoding("UTF-8");
res.setContentType("text/html;charset=UTF-8");
PrintWriter pw = res.getWriter();
//得到用户名、密码和隐藏的性别
String u = req.getParameter("uname");
String p = req.getParameter("pword");
String sex = req.getParameter("sex");
pw.println("用户名:"+u);
pw.println("密码:"+p);
pw.println("性别:"+sex);
}catch(Exception e){
e.printStackTrace();
}
}
}
在网站中访问:http://localhost:8080/myWebSite/hiddenform1,可以看到浏览器输出:
登录界面
用户名:密码:
填写之后,点击提交,浏览器显示:
用户名:weiya 密码:1234 性别:abc
相关文章推荐
- servlet小总结3----同一用户的不同页面的共享数据的四种方法,及Servlet中操作数据库时等
- 同一个用户在不同页面共享数据的常用方法
- 同一用户的不同页面共享数据的四种技术(一)
- servlet第3讲(中集)----同一用户的不同页面共享数据
- servlet学习---第三天(同一用户的不同页面数据共享)
- jsp在不同页面或者用户之间共享数据
- servlet同一用户的不同页面共享数据
- 同一用户的不同页面共享数据(四)
- servlet学习笔记2——同一用户的不同页面共享数据
- Servlet同一用户的不同页面共享数据
- 同一用户的不同页面共享数据
- 同一用户的不同页面共享数据(二、三)
- servlet同一用户不同页面共享数据
- 【2015/4/18】servlet学习笔记4--同一用户怎么共享不同页面的数据。
- 同一用户的不同页面共享数据
- 同一用户不同页面共享的三种方法
- 同一用户的不同页面共享数据
- 使用servlet实现同一用户的不同页面共享数据
- JSP(3):servlet 用同一用户的不同页面共享数据(session)
- servlet第3讲(上集)----同一用户的不同页面共享数据