zoukankan      html  css  js  c++  java
  • 会话管理

    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:服务器启动时创建对象,服务器关闭时销毁,作用域范围是整个项目

  • 相关阅读:
    优秀JS学习站点
    一些比较好的论坛、博客
    最全前端问题及答案总结[转]
    EDM制作要点
    前端技术-调试工具(下)
    前端技术-调试工具(上)
    smartJQueryZoom(smartZoom) 的使用方法
    修改博客园日历的默认样式
    smartJQueryZoom(smartZoom) 存在的兼容性BUG,以及解决方法
    javascript实战 : 简单的颜色渐变
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11407742.html
Copyright © 2011-2022 走看看