zoukankan      html  css  js  c++  java
  • JavaWeb之HttpSession

    时间:2016-11-17 22:33

    ——HttpSession

    一、HttpSession概述
        1、HttpSession是由JavaWeb提供的,用来进行会话跟踪的类。
        2、session和cookie的区别
            session是服务器端对象,保存在服务器端,是由JavaWeb提供的,只有JavaWeb有。
            cookie保存在客户端,是由HTTP协议提供的。
        3、HttpSession是Servlet三大域对象之一,所以它也有setAttribute()、getAttribute()和removeAttribute()方法。
        4、HttpSession底层依赖Cookie或是URL重写。

    二、HttpSession的作用
        1、会话范围
            会话范围是某个用户从首次访问服务器开始,到该用户关闭浏览器结束。

        2、会话
            一个用户对服务器的多次连贯性请求,所谓连贯性请求,就是该用户多次请求中间没有关闭浏览器。

        3、服务器会为每个客户端创建一个session对象,它们被服务器保存到一个Map中,这个Map被称为session缓存。
            *   Servlet中得到session对象:HttpSession session = request.getSession();
            *   JSP中得到session对象:session是JSP内置对象,不需要创建就可以直接使用。

        4、session域的相关方法:
            void setAttribute(String name,Object value)
            Object getAttribute(String name)
            void removeAttribute(String name)

    三、案例1
        演示session中会话的多次请求中共享数据
        *   AServlet:向session域中保存数据
            a.jsp:

                <h1>向Session域保存数据</h1>
                <%
                    //如果需要自己手动获取session对象,代码如下
                    //HttpSession session = request.getSession();
                    session.setAttribute("aaa","AAA");
               %>

        *   BServlet:从session域中获取数据
            b.jsp:

                <h1>获取session中的数据</h1>
                <%
                    String s = (String)session.getAttribute("aaa");
                %>
                <%=s %>

        *   演示
            第一个请求:访问AServlet
            第二个请求:访问BServlet
        *   此时如果不关闭当前浏览器再打开新的浏览器窗口,则也能访问到b.jsp中的session对象,即也可以输出“AAA”

    四、案例2
        演示保存用户登录信息(必须掌握)
        问题:
            为什么请求重定向需要包含完整Servlet路径?
                因为重定向是客户端根据URL重新发送请求,所以需要重写URL。 

    1、案例相关页面和Servlet
        *   login.jsp:登录页面
        *   successful1.jsp:只有登录成功才能访问的页面
        *   successful2.jsp:只有登录成功才能访问的页面
        *   LoginServlet.java:校验用户是否登录成功

    2、各页面和Servlet内容
        *   login.jsp:提供登录表单,提交表单请求LoginServlet
        *   LoginServlet:获取请求参数,校验用户是否登录成功
            成功:保存用户信息到session域中,重定向到successful1.jsp页面,显示session域中的用户信息。
                重定向是客户端请求,必须加项目名。
            失败:保存错误信息到request域中,转发到login.jsp(login.jsp显示request域中的错误信息)
            如果需要进行跨请求获取参数,就是用session,如果只需要一个请求,则使用request,尽量使用范围小的域对象。
        *   successful1.jsp:从session域中获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息。
        *   successful2.jsp:从session域中获取用户信息,如果不存在,显示“您还没有登录”,存在则显示用户信息。

        只要用户没有关闭浏览器,session就一直存在,那么保存在session中的用户信息也就存在,那么用户
        访问successful1.jsp和successful2.jsp就会成功。

    代码如下:
    ------------------------------------------------------------------------------------------------------------------------------------------
    login.jsp


    <body>
        <%-- 本页面提供登录表单,还要显示错误信息 --%>
        <h1>登录</h1>
        <%
            //读取名字为cusername的Cookie
            //如果为空显示:""
            //如果不为空显示:cookie的值
            String cusername = "";
            //获取请求中所有的Cookie
            Cookie[] cs = request.getCookies();
            if(cs != null)//如果存在cookie
            {
                for(Cookie c : cs)//循环遍历所有的cookie
                {
                    if("cusername".equals(c.getName()))//查找名为cusername的cookie
                    {
                        cusername = c.getValue();//获取这个cookie的值,赋给cusername变量
                    }
                }
            }
        %>

        <%--输出错误信息 --%>
        <%
            String errorMessage = "";
            //获取request域中的错误信息
            String message = (String)request.getAttribute("errorMessage");
            if(message != null)
            {
                errorMessage = message;
            }
        %>
        <font color="red"><b><%=errorMessage %></b></font>
        <%--把cookie中的用户名显示到用户名文本框中 --%>
        <form action="/day11_3/LoginServlet" method="post">
            用户名:<input type="text" name="username" value="<%=cusername%>"/><br/>
            密    码:<input type="password" name="password" /><br/>
            <input type="submit" vale="登录" />
        </form>
    </body>

    ------------------------------------------------------------------------------------------------------------------------------------------

    LoginServlet.java
        //1、获取表单数据
        //处理编码问题
        request.setCharacterEncoding("utf-8");
        //获取参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //2、验证用户名和密码
        if("admin".equalsIgnoreCase(username) && "admin".equalsIgnoreCase(password))
        {
            //将用户名保存到cookie中,发送给客户端浏览器
            //当再次打开login.jsp时,login.jsp会读取request中的cookie,把它显示到用户名文本框中
            Cookie cookie = new Cookie("cusername",username);//创建Cookie
            cookie.setMaxAge(60*60);
            response.addCookie(cookie);//保存cookie,最终会变成设置Set-Cookie的头
            //3、登录成功,保存信息到session
            HttpSession session = request.getSession();//获取Session对象
            session.setAttribute("username", username);//在session域中保存用户名
            //重定向到successful1.jsp
            response.sendRedirect("/day11_3/session2/successful2.jsp");
        }
        else
        {
            //登录失败
            //保存错误信息到request域中
            request.setAttribute("errorMessage", "用户名或密码不正确");
            //转发到login.jsp
            RequestDispatcher rd = request.getRequestDispatcher("/session2/login.jsp");//得到转发对象
            rd.forward(request, response);
        }

    -----------------------------------------------------------------------------------------------------------------------------------------

    successful.jsp

    <body>
        <h1>Successful1</h1>
        <%
            String username = (String)session.getAttribute("username");
            if(username == null)
            {
                //向request域中保存错误信息,转发到login.jsp
                request.setAttribute("errorMessage","请先登录");
                request.getRequestDispatcher("/session/login.jsp").forward(request, response);
                return;
            }
        %>
        <%=username %>登录成功  
    </body>


    五、HttpSession原理

        session保存在服务器,通过Cookie将SessionID传递给客户端。

        request.getSession()方法
        1、获取Cookie中的JSESSIONID:
            *   如果sessionId不存在,就创建session,把session保存起来,把新创建的sessionId(JSESSIONID)保存到Cookie中。
            *   如果sessionId存在,通过sessionId查找session对象,如果没有查找到,创建session对象,把新创建的sessionId保存到Cookie中。
            *   如果sessionId存在,通过sessionId查找到session对象,那么就不会再创建session对象了。
            *   返回session对象。
        2、如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。
        3、下次请求再执行request.getSession()方法时,因为可以通过Cookie中的sessionId找到session对象,所以与上一次请求使用的是同一session对象。
        4、服务器不会马上创建session,而是在第一次获取时(getSession()),才会创建Session对象。
        5、如果访问JSP页面,则会自动创建SESSION对象,因为Session对象是JSP内置对象。

        getSession(false)、getSession(true)、getSession()方法的区别:
            getSession(false):如果session缓存中(Cookie中)不存在session,那么返回null,而不会创建session对象。
        
    六、HttpSession其他方法
        String getId()
            获取sessionId。

            UUID:生成一个随机的、不重复的、32位长度的、16进制字符串。
            UUID代码:
                //获取UUID对象

                UUID uuid = UUID.randomUUID();
                //将UUID对象转换成字符串
                String string = uuid.toString();
                //去掉“-”字符
                string = string.replace("-", "");
                //将字母转换成大写
                string = string.toUpperCase();

            sessionId的获取方式就是通过UUID来获取的。
            sessionId可以放到cookie中发送给客户端。 

            问题:sessionId的作用是什么? 


        int getMaxInactiveInterval()
            获取session的最大不活动时间(秒),默认为30分钟,当session在30分钟内没有使用,那么Tomcat会在session池中移除这个session。

        void invalidate()
            让session失效,调用这个方法session会失效,当session失效后,客户端再次请求,服务器会为此次会话创建一个新的session,并在响应中给客户端新session的sessionId。可以用作退出登录按钮。

        boolean isNew()
            查看session是否是新的,当客户端第一次请求时,服务器为客户端创建session,但这时服务器还没有响应客户端,也就是还没有把sessionId响应给客户端时,这时的session的状态为新。
            只要请求中不带cookie,那么session就是新的。当把sessionId放到cookie发送给客户端后,客户端再发送请求,那么session就是旧的。
            该方法可以用来判断是创建session还是返回session:request.getSession().isNew();

    七、web.xml中配置session的最大不活动时间
        <session-config>
            <session-timeout>30</session-timeout>
        </session-config>

    八、URL重写

        就是把页面中所有的超链接路径,都使用response.encodeURL("....")进行处理。
     
        1、session依赖cookie,目的是让客户端发出请求时归还sessionId,这样才能找到它对应的session。
        2、如果客户端禁用了Cookie,那么就无法得到sessionId,所以session也就无法使用了。
        3、也可以使用URL重写来替代Cookie
            *   这让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionId。
            *   这样服务器可以通过获取请求参数得到sessionId,从而找到session对象。
        4、response.encodeURL(String url)
            *   该方法会对URL进行智能的重写:当请求中没有归还sessionId这个cookie,那么该方法会重写URL,否则不重写。
            *   URL必须是指向本站的URL。

  • 相关阅读:
    nmap加快扫描速度(转载)
    deepin换源
    利用74HC595实现的流水灯 Arduino
    解决用vscode开发arduino时Serial未定义
    JS获取格式为YYYY-MM-DD的当前日期
    链式前向星存图
    Nginx+FFmpeg实现RTSP转RTMP
    非root用户安装centos的jdk
    Nginx配置请求头
    Eclipse-Che 安装(Centos)
  • 原文地址:https://www.cnblogs.com/wwwwyc/p/6375295.html
Copyright © 2011-2022 走看看