java的会话技术和session

1、会话技术
(1)从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。
注:浏览器没关,只关闭一个网页不算会话结束;
(2)分类:cookie和session
2、cookie:客户端本地;客户端可以清除cookie;安全性不好;减轻服务器存储压力;


(1)服务器向客户端发送一个cookie:响应头set-cookie
   1)创建cookie;Cookie cookie = new Cookie(String Name,String Value);
       键值对;set-cookie响应头;别写中文;
   2)设置持久化时间:cookie.setMaxAge(60*10)里面的单位是秒;
     不设置存储在浏览器内存中,关闭后销毁,设置后持久化到浏览器的磁盘文件;超过时间自动销毁;
3)设置携带路径:cookie.setPath(String path);
     注:("/")任何路径都可以;("/web05")web05下的所有路径都可以;
    不设置cookie信息会在访问产生该cookie的web资源所在的路径都携带cookie信息;
    举例:cookie信息在web05的sendcookie里,那么访问完sendcookie后,访问web05下的其他项目也会有此cookie信息;
4)发送cookie:response.addCookie(Cookie cookie);

package com.oracle.cookie;

import java.io.IOException;
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 cookieServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //1、创建cookie对象
        Cookie cookie = new  Cookie("goods","xsphone");
        //设置cookie持久化时间----------在硬盘上保存的时间
        cookie.setMaxAge(60);
        //为cookie设置携带路径
        //cookie.setPath("/Day20/cookieServlet");
        //cookie.setPath("/Day20");
        //2、存储数据发送到客户端
        response.addCookie(cookie);
        response.getWriter().write("hello world!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

效果如下:


5)删除cookie:使用同名同路径的持久化时间为0的cookie进行覆盖;必须是同名同路径;

package com.oracle.cookie;

import java.io.IOException;
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 removecookieServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //创建一个cookie
        Cookie cookie = new  Cookie("goods","xsphone");
        cookie.setPath("/Day20");
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        response.getWriter().write("hello world!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

重新设置时间操作显示如下:

(2)服务器接收客户端cookie:请求头cookie
1)获取所有的cookie:Cookie[] cookies = request.getCookies();
2)遍历Cookie数组:
for(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){String cookieValue = cookie.getValue();}}

注意先访问cookieServlet!

package com.oracle.cookie;

import java.io.IOException;
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 getcookieServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        //先获取装有cookie对象的数组
        Cookie[]  cookie = request.getCookies();
        for(Cookie  c:cookie){
            if(c.getName().equals("goods")){
                System.out.println(c.getValue());
            }
        }
        response.getWriter().write("hello world!");
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

效果如下:

控制台打印输出:


3、session:服务器;安全性好;加重服务器存储压力;


(1)获得Session对象:HttpSession session = request.getSession();
!!!在一个浏览器中sessionid是同一个;根据sessionid判断是否存在;
(2)设置session持久化时间:Cookie cookie = new Cookie("JSESSIONID",request.getSession().getId());cookie.setMaxAge(60*10);
本质是设置cookie;
(3)session也是一个域对象;三个方法;

package com.oracle.seesion;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class session extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        HttpSession  session = request.getSession();
        String   id = session.getId();
        session.setAttribute("goods", "shouji");
        //设置JSESSIONID的持久化时间
        Cookie  cookie = new  Cookie("JSESSIONID",id);
        cookie.setPath("/Day20");
        cookie.setMaxAge(60*2);
        response.addCookie(cookie);
        response.getWriter().write(id);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

效果如下:

不关闭浏览器的情况下,访问第二个servlet:

package com.oracle.seesion;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class seesion extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");
        HttpSession  session = request.getSession();
        String   id = session.getId();
        HttpSession  session1 = request.getSession();
        String   id1 = session1.getId();
        String name = (String)session.getAttribute("goods");
        response.getWriter().write(id+".."+id1);
        response.getWriter().write(name);
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

效果如下:

!!!可以看出ID都是一样的;
(4)session生命周期:第一次执行request.getSession()时创建;服务器(非正常)关闭时或者session过期/失效(默认30分钟)销毁;
(5)设置session销毁时间:从不操作服务器端的资源开始计时默认30分钟;session.invalidate();web.xml配置;

猜你喜欢

转载自www.cnblogs.com/scw123/p/9968134.html