Web服务器跟踪用户状态的方法:
重写URL,使它包含用于跟踪客户状态的数据。
用Cookie来传递用于跟踪客户状态的数据。将信息保存到客户端。
使用会话Session机制。由服务器来管理。
注意它们的区别:
一个是将信息保存到客户端。Cookie – javax.servlet.Cookie
一个是由服务器来维护。Session - javax.servlet.http.HttpSession
Cookie-简介:
Cookie,是客户端在访问web服务器时,服务器在客户端的机器上存放的信息。
服务器将Cookie保存在客户机器上的原因是为了跟踪客户的状态。这主要用于特殊的场合如电子商务。
JavaServletApi为Cookie提供了简单实现,javax.servlet.http.Cookie类表示Cookie。
Cookie保存客户端的硬盘上,通过key和value值来保存信息,类似于Map。Cookie的key和value不能使用中文。如果要保存中文,必须使进行编码。
切记:
Cookie保存的时间通过设置setMaxAge来设置 (默认值为-1)
如果大于0,就表示在客户机的硬盘上保存N秒。
如果小于0,就表示不将Cookie保存到客户机的硬盘上,当浏览器关闭时,Cookie当即消失。
如果等于0,就表示删除保存在客户机上的Cookie。
Cookie类的方法:
cookie.setMaxAge(60);在客户端保存的有效时间,以秒为单位。
cookie.setPath(“/”);设置Cookie的有效使用域。默认为当前Servlet所在的目录。
设置为/则整个tomcat有效。
设置为/myProj即,整个myProj项目有效。
setSecure(true|false);默认值为false,是否只支持https。
注意:
一般情况key值不建议使用中文。value值可以使用中文,但必须要经过编码才可以保存,否则保存时会抛出异常。
当然,读取经过编码的值时,必须要再解码。
主页
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
cookie权限(相同路径可以读取.子路径的servlet可以读上级路径的cookie,反之不行!): 说明:cookie的path(路径): 通过 coo.setPath()来设置的 servlet的路径: 在web.xml中用< url-pattern>来配置 1)可以读取---相同路径 CookieServletDemo_2(/servlet/cookieServlet)的cookie设置的path= reqeust.getContextPath() ---等价于“/” 读取cookie的servlet--CookieServletDemo(/cookieServlet)的路径: / 2)下面的也可以读---子路径的servlet 可以读 上级路径的cookie CookieServletDemo(/cookieServlet)的cookie设置的path= reqeust.getContextPath() ---等价于“/” 读取cookie的servlet--CookieServletDemo_2(/servlet/cookieServlet)的路径: /servlet 3)下面的不可以读 CookieServletDemo_2(/servlet/cookieServlet)的cookie设置的path= reqeust.getContextPath()/servlet ---等价于“/servlet” 读取cookie的servlet--CookieServletDemo(/cookieServlet)的路径: /
package cn.hncu.servlet; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CookieServletDemo extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println(""); out.println(" "); out.println(""); out.println(""); //分离式做法--streth框架 // addCookie(request,response);//Cookie添加/修改---向浏览器/客户端添加 readCookie(request,response);//读客户端发来的Cookie // delCookie(request,response);//就是向浏览器添加一个maxAge值为0的key与将要被删除Cookie的key相同的Cookie out.println(""); out.println(""); out.flush(); out.close(); } private void delCookie(HttpServletRequest request, HttpServletResponse response) { Cookie coo=new Cookie("name", "123");//删除key为nam的属性 coo.setMaxAge(0);//设置有效期为0,即删除 Cookie coo.setPath(request.getContextPath());// response.addCookie(coo); } private void readCookie(HttpServletRequest request, HttpServletResponse response) throws IOException { Cookie cs[]=request.getCookies(); if (cs!=null) { for (Cookie c : cs) { String key=c.getName(); String value=c.getValue(); //value中文需要解码 value=URLDecoder.decode(value, "utf-8"); int maxAge=c.getMaxAge(); System.out.println("CookieServletDemo读的Cookie:key="+key+",value="+value+"maxAge="+maxAge); } }else{ System.out.println("CookieServletDemo读的Cookie:null"); } } private void addCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {//Cookie添加/修改---向浏览器/客户端添加 // String name="aa";//1.写死了 /*//2.不是中文 String name="hncu"; Random r=new Random(); int i=r.nextInt(1000);//1000以内的某个整数 name+=i;*/ //3.中文 String name="湖南城院"; System.out.println(name); //name为中文时,需要编码--否则出现500编码问题 name=URLEncoder.encode(name, "utf-8"); Random r=new Random(); int i=r.nextInt(1000);//1000以内的某个整数 name+=i; System.out.println("CookieServletDemo添加/修改Cookie:"+name); Cookie coo=new Cookie("name", name); coo.setMaxAge(60*60);//有效期为一个小时--为该Cookie设置有效期,浏览器自动转成过期时间 //2.演示 可以读---子路径的servlet可以读 上级路径的cookie coo.setPath(request.getContextPath());//由路径控制访问权限 response.addCookie(coo); //如果存在相同的key的Cookie,则是覆盖(修改).若不存在则是新建(添加) } }
增改Cookie
查Cookie
删Cookie
package cn.hncu.servlet; import java.io.IOException; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; import java.util.Random; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CookieServletDemo_2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println(""); out.println(" "); out.println(""); out.println(""); //分离式做法--streth框架 addCookie(request,response);//Cookie添加/修改---向浏览器/客户端添加 // readCookie(request,response);//读客户端发来的Cookie out.println(""); out.println(""); out.flush(); out.close(); } private void readCookie(HttpServletRequest request, HttpServletResponse response) throws IOException { Cookie cs[]=request.getCookies(); if (cs!=null) { for (Cookie c : cs) { String key=c.getName(); String value=c.getValue(); //value中文需要解码 value=URLDecoder.decode(value, "utf-8"); int maxAge=c.getMaxAge(); System.out.println("CookieServletDemo_2读的Cookie:key="+key+",value="+value+"maxAge="+maxAge); } } } private void addCookie(HttpServletRequest request, HttpServletResponse response) throws IOException {//Cookie添加/修改---向浏览器/客户端添加 // String name="aa";//1.写死了 /*//2.不是中文 String name="hncu"; Random r=new Random(); int i=r.nextInt(1000);//1000以内的某个整数 name+=i;*/ //3.中文 String name="湖南城院"; System.out.println(name); //name为中文时,需要编码--否则出现500编码问题 name=URLEncoder.encode(name, "utf-8"); Random r=new Random(); int i=r.nextInt(1000);//1000以内的某个整数 name+=i; Cookie coo=new Cookie("name", name); coo.setMaxAge(60*60);//有效期为一个小时--为该Cookie设置有效期,浏览器自动转成过期时间 //1.演示 可以读取---相同路径 // System.out.println("CookieServletDemo_2添加/修改Cookie(设置为相同路径):"+name); // coo.setPath(request.getContextPath());//由路径控制访问权限 //3.演示 不可以读取--上级路径的servlet不可以读子路径的cookie System.out.println("CookieServletDemo_2添加/修改Cookie(设置为子路径):"+name); coo.setPath(request.getContextPath()+"/servlet");//由路径控制访问权限 response.addCookie(coo); //如果存在相同的key的Cookie,则是覆盖(修改).若不存在则是新建(添加) } }
1)可以读取—相同路径
2)可以读—子路径的servlet可以读 上级路径的cookie
3)不可以读取–上级路径的servlet不可以读子路径的cookie
配置文件
CookieServletDemo cn.hncu.servlet.CookieServletDemo CookieServletDemo_2 cn.hncu.servlet.CookieServletDemo_2 CookieServletDemo /cookieServlet CookieServletDemo_2 /servlet/cookieServlet index.jsp