会话管理

1、什么是会话?

  用户打开浏览器,浏览页面,直到关闭浏览器的过程,称为一次会话。

2、什么是会话技术?

  因为HTTP是一个无状态协议,服务端无法记录客户端的身份信息。

  例如在购物网站购买东西时,需要用到的购物车(记录用户挑选的商品),这时会发现request无法做到,ServletContext也无法做到。

  因此需要用到会话跟踪技术。

3、会话跟踪技术包括:Cookie(客户端技术) Session(服务器端技术)

Cookie

1、服务器负责:

    1.负责写cookie

    2.负责解析浏览器传过来的cookie

  浏览器负责:

    1.负责保存cookie

    2.负责将cookie发送给服务器

2、工作原理

  学生上学入学时交学费,但同时入学的人太多,学校也无法准确记住每个人的信息(HTTP无状态)

  所以在每个学生入学时发一个学生证,证件上记录学生的信息(Cookie)

  在学生上学时,只需要带着学生证,就可以知道这个学生的信息

  

  当第一次请求到达时,服务创建一个Cookie,并且把cookie响应给客户端(浏览器),

  当浏览器进行第二次请求时,携带上次请求时的cookie的信息,服务端就会识别到本次请求和上次请求在一个会话之内。

3、使用方法  

  1 构造方法: Cookie c = new Cookie(“”,“”);

     创建Cookie时, name和value都是字符串。注意:不能用中文字符串。 

  2 getName() 获得Cookie的name

  3 getValue() 获得Cookie的value 注意:Cookie没有提供根据name获取value的方法

  4 setMaxAge(int 秒) 设置Cookie的存活时间   

    cookie.setMaxAge(int seconds);

    seconds > 0:   存货多长时间;

    seconds =0:    立即失效

    seconds <0:   会话cookie

  5 setPath() 设置Cookie的有效路径

   浏览器将cookie保存硬盘的路径,是各个浏览器自己制定,其他无法进行操作的。

   有效路径:浏览器发送请求时,cookie的代入路径。

  请求路径 等于或者包含cookie的有效路径,该cookie会在请求时被代入。

方法名

描述

setPath(java.lang.String uri)

设置有效路径。

设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。

例如:setPath("/web/a/b");

http://localhost:8080/web/a/b/oneServlet,可访问(当前路径)

http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径)

http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径)

常见设置:setPath(“/”) ,当前tomcat下的所有的web项目都可以访问

  7 获得客户端带过来的Cookie

      Cookie[] cs = request.getCookies()

  8 服务器端把Cookie带到客户端

      response.addCookie(cookie);

4、案例一:记录客户端是否是第一次访问

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

import org.apache.jasper.tagplugins.jstl.core.ForEach;

@WebServlet("/login1")
public class CookieLoginServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        response.setContentType("text/html;charset=utf-8");
        
        boolean flag = false;
        Cookie[] cookies = request.getCookies();
        if(cookies != null) {
            for (Cookie cookie : cookies) {
                if("username".equals(cookie.getName())) {
                    flag=true;
                    break;
                }
            }
        }
        String str = "欢迎第一次访问!!";
        if(flag) {
            str = "欢迎回来";
        }else {
            Cookie coo1 = new Cookie("username", username);
            Cookie coo2 = new Cookie("password", password);
            coo1.setMaxAge(3);
            response.addCookie(coo1);
            response.addCookie(coo2);
        }
        response.getWriter().println("<h1>"+str+"</h1>");
        
    }

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

}
案例一
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="login1" method="post">
        用户名:<input type="text" name="username"/><br/>&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br/>
        <input type="submit" value="登录"/>
    </form>
</body>
</html>
案例一

5、案例二:使用Cookie记录客户端上次访问时间

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


@WebServlet("/cookieLogin2")
public class MyServlet2 extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        
        String str = "欢迎光临!!";
        Cookie[] cookies = request.getCookies();
        if(cookies !=null) {
            for (Cookie cookie : cookies) {
                if("visited".equals(cookie.getName())) {
                    str = "您上次访问时间为"+cookie.getValue();
                    break;
                }
            }
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd--HH:mm:ss");
        Date date = new Date();
        String da = sdf.format(date);
        Cookie cookie = new Cookie("visited", da);
        response.addCookie(cookie);
        response.getWriter().println("<h1>"+str+"</h1>");
        
    
    }

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

}
案例二
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="cookieLogin2" method="post">
        用户名:<input type="text" name="username"/><br/>&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br/>
        <input type="submit" value="登录"/>
    </form>
</body>
</html>
案例二

6、案例三:使用Cookie记录访问次数

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


@WebServlet("/cookieLogin3")
public class Myservlet3 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        
        boolean flag = false;
        Cookie coo=null;
        Cookie[] cookies = request.getCookies();
        if(cookies != null) {
            for (Cookie cookie : cookies) {
                if("count".equals(cookie.getName())) {
                    coo=cookie;
                    flag=true;
                    break;
                }
            }
        }
        int num=1;
        if(flag) {
            num = Integer.parseInt(coo.getValue())+1;
        }
        Cookie c = new Cookie("count", num+"");
        response.addCookie(c);
        response.getWriter().println("<h1>您是第"+num+"次访问</h1>");
    }

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

}
案例三
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="cookieLogin3" method="post">
        用户名:<input type="text" name="username"/><br/>&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br/>
        <input type="submit" value="登录"/>
    </form>
</body>
</html>
案例三

Session

1、会话管理已经有了Cookie,为什么还要有Session?

  Cookie有大小和个数的限制的.  Session存在服务器端没有大小和个数的限制.

     Cookie存到客户端上 信息不安全.  Session的数据相对来说安全.

  Session运行原理也是基于Cookie :利用Cookie回写一个 JSESSIONID 

2、获取Session  

   方式一:  HttpSession session = request.getSession()

          如果session还没有创建,则创建。

     如果已经创建,则使用已经创建的session。

  方式二:  HttpSession session = request.getSession(false);

          如果session已经创建过,则使用已经创建的session。

     如果session没有创建过,则返回null。

   Session的getId() 方法可以获得Session的id

3、Session的常用方法  

 session.setAttribute("",Object);

   session.getAttribute("");

   session.removeAttribute("");

4、Session的案例一:如果是第一次访问则输出第一次访问,如果不是,则输出欢迎回来。 

  如果页面放入了文件夹,要注意加上项目路径或者   使用  ../ 出文件夹再写想要访问的路径

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


@WebServlet("/sessionLogin1")
public class Myservlet1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        String str = "";
        HttpSession session = request.getSession(false);
        if(session!=null) {
            str = "欢迎回来";
        }else {
            str="第一次访问";
            session=request.getSession();
        }
        response.getWriter().println("<h1>"+str+"</h1>");
    }

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

}
案例一
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
    <form action="/会话/sessionLogin1" method="post">
        用户名:<input type="text" name="username"/><br/>&nbsp;&nbsp;&nbsp;码:<input type="password" name="password"><br/>
        <input type="submit" value="登录"/>
    </form>
</body>
</html>
案例一

5、Session的创建和销毁

  第一次调用getSession()是创建Session

  销毁:1.服务器的非正常关闭(如果是正常关闭,Session会被序列化到服务器中,也叫钝化,在下次服务器启动时会再次激活,也叫活化)

  2.Session的时间到期,默认30分钟,默认配置在tomcat的web.xml中

       <session-config>

                       <session-timeout>30</session-timeout>

                   </session-config>

             可以在自己的web.xml配置Session的过去时间,配置方式和tomcat的web.xml中配置方式相同。

  3.调用Session的invalidate()方法

6、Session和Cookie的关系 及区别

  Session运行原理也是基于Cookie :利用Cookie回写一个 JSESSIONID 

  1.数据存储的位置不同 Cookie在客户端 Session在服务器端

       2.生命周期不同

    Cookie(会话Cookie浏览器关闭   持久化Cookie setMaxAge(秒数))Session(默认30分钟,可以修改)

       3.cookie只能存放字符串名值对,session可以是任意对象

       4.同一个浏览器接受cookie的个数是有上限

7、浏览器禁用Cookie后,Session将不能使用

  还想继续使用:手动在路径后面拼接一个JSESSIONID  如 ;jsessionid=r7boiko6m95lg180mla9oib562

  或者使用response的encodeRedirectURL()方法

           String path = "/testServlset";

        String path1 = response.encodeRedirectURL(path);

         response.sendRedirect(path1);

  禁用Cookie还想使用Session,那么将你网站的所有的路径 都需要进行URL的重写.

  一般在真实应用中,当禁用了Cookie时,将不能使用Session.

  例如购物网站,在禁用Cookie后,则无法进行购物。

8、Servlet的三个作用域详解 

  HttpServletRequest:客户端向服务器发送一次请求,服务器就会创建一个request对象,当服务器对这次请求做出响应后,request对象就失效了  作用域范围:一次请求的范围

  HttpSession:第一次调用getSession()时创建,销毁:不正常关闭服务器,过期,调用invalidate方法;作用域范围:一次会话的范围

  ServletContext:服务器启动时创建对象,服务器关闭时销毁,作用域范围是整个项目

原文地址:https://www.cnblogs.com/xfdhh/p/11407742.html