java--会话管理(Cookie Session)

来源:互联网 发布:厦门软件学院怎么样 编辑:程序博客网 时间:2024/04/25 10:08

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"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>Cookie/Session演示</title>  </head>  <body>    <h2>Cookie/Session演示</h2>    <a href="<%=request.getContextPath()%>/cookieServlet">CookieDemo基本用法</a>    <h3>演示Cookie的访问权限</h3>    <form action="<%=request.getContextPath() %>/servlet/cookieServlet">        姓名:<input type="text" name="name"/><br/>        <input type="submit" value="提交"/>    </form>    <pre>    <font color="red" size="5">cookie权限(相同路径可以读取.子路径的servlet可以读上级路径的cookie,反之不行!):</font>        说明: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)的路径: /    </pre>  </body></html>
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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        //分离式做法--streth框架//      addCookie(request,response);//Cookie添加/修改---向浏览器/客户端添加        readCookie(request,response);//读客户端发来的Cookie//      delCookie(request,response);//就是向浏览器添加一个maxAge值为0的key与将要被删除Cookie的key相同的Cookie        out.println("  </BODY>");        out.println("</HTML>");        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("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");        out.println("<HTML>");        out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");        out.println("  <BODY>");        //分离式做法--streth框架        addCookie(request,response);//Cookie添加/修改---向浏览器/客户端添加//      readCookie(request,response);//读客户端发来的Cookie        out.println("  </BODY>");        out.println("</HTML>");        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

这里写图片描述

配置文件

<?xml version="1.0" encoding="UTF-8"?><web-app version="3.0"     xmlns="http://java.sun.com/xml/ns/javaee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee     http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  <display-name></display-name>  <servlet>    <servlet-name>CookieServletDemo</servlet-name>    <servlet-class>cn.hncu.servlet.CookieServletDemo</servlet-class>  </servlet>  <servlet>    <servlet-name>CookieServletDemo_2</servlet-name>    <servlet-class>cn.hncu.servlet.CookieServletDemo_2</servlet-class>  </servlet>  <servlet-mapping>    <servlet-name>CookieServletDemo</servlet-name>    <url-pattern>/cookieServlet</url-pattern>  </servlet-mapping>      <servlet-mapping>    <servlet-name>CookieServletDemo_2</servlet-name>    <url-pattern>/servlet/cookieServlet</url-pattern>  </servlet-mapping>      <welcome-file-list>    <welcome-file>index.jsp</welcome-file>  </welcome-file-list></web-app>
0 0