频道栏目
首页 > 资讯 > Java > 正文

java--会话管理(Cookie Session)

16-10-08        来源:[db:作者]  
收藏   我要投稿

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/Session演示

    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
  

相关TAG标签
上一篇:struts2的数据校验
下一篇:关于程序的运算时间复杂度的一点思考
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站