java学习笔记——javaweb之cookie 与 session

1、Cookie饼干

1.1、什么是Cookie?

 

Cookie,翻译是小饼的意思。它是一种服务器告诉浏览器以键值对形式存储小量信息的技术。

 

1.2、Cookie的使用

1.2.1、Cookie的创建

  1. 先创建一个Servlet编写创建Cookie的代码,
  2. 然后打开浏览器访问Servlet程序。
  3. 按下F12.查看Cookie内容。

 

 

1)图解Cookie的创建过程:

 

2)Cookie的创建代码:

/**

 * Cookie的代码

 */

public class CookieServlet extends BaseServlet {

    private static final long serialVersionUID = 1L;

 

    protected void createCookie(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       

        // Cookie的创建

        Cookie cookie = new Cookie("cookie-name", "cookie-Value");

        Cookie cookie2 = new Cookie("cookie-name2", "cookie-Value2");

 

        // 告诉浏览器保存

        response.addCookie(cookie);

        response.addCookie(cookie2);

        response.getWriter().write("已创建Cookie……");

    }

}

 

 

3)web.xml文件中的配置

    <servlet>

        <servlet-name>CookieServlet</servlet-name>

        <servlet-class>com.atguigu.servlet.CookieServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>CookieServlet</servlet-name>

        <url-pattern>/cookieServlet</url-pattern>

    </servlet-mapping>

 

4)修改html页面中连接的访问地址为:

<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>

 

然后点击访问。记住,访问的时候,一定不是把html的页面托到浏览器中访问,而是在浏览器里输出地址,通过访问Tomcat服务器访问页面。

 

5)浏览器工具--查看结果:

谷歌浏览器,直接按下F12功能键,会弹出调试工具,选择Resource-----Cookies----localhost查看localhost域名下的cookie

 

 

如果是火狐浏览器。同样按下F12功能键,弹出调试工具(一定要记住启用所有窗口)。选择Cookies选择卡

 

1.2.2、Cookie的获取

  1. 编写好获取Cookie的代码
  2. 修改html连接,点击访问
  3. 打开浏览器工具查看HTTP协议内容
  4. 查看服务器代码获取Cookie后的输出

 

 

1)图解Cookie的获取过程

 

2)获取Cookie的代码:

    protected void getCookie(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 获取所有cookie对象

        Cookie[] cookies = request.getCookies();

        // 如果没有cookie,则返回null。

        if (cookies != null) {

            // 有cookie则遍历

            for (Cookie cookie : cookies) {

                response.getWriter().write("Cookie名:" + cookie.getName()

                        + "<br/>Cookie值:" + cookie.getValue() + "<br/><br/>");

            }

        } else {

            response.getWriter().write("没有Cookie");

        }

       

    }

3)修改html页面中的连接访问地址为:

<li><a href="cookieServlet?action=getCookie" target="target">Cookie的获取</a></li>

 

修改完之后,点击连接访问服务器

 

4) 通过浏览器查看请求头

 

 

5)页面输出

1.2.3、Cookie值的修改

  1. 在Servlet中添加修改Cookie值的代码
  2. 修改html页面中修改cookie的连接,并访问
  3. 打开浏览器的调试工具查看,请求头和响应头中Cookie的信息

 

 

1)图解修改Cookie值的过程:

 

 

 

2)修改Cookie值的代码:

 

    protected void updateCookie(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       

        // 创建一个已存在key的Cookie对象

        Cookie cookie = new Cookie("cookie-name", null);

        // 修改Cookie的值

        cookie.setValue("this is new value");

        // 通知浏览器保存修改

        response.addCookie(cookie);

        response.getWriter().write("Cookie…已修改值");

    }

 

 

3)修改html页面中update修改cookie的访问地址为:

            <li><a href="cookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li>

 

修改完Cookie更新的连接访问之后,点击访问。

 

 

4)打开浏览器调试工具查看请求头和响应头中Cookie的信息

 

5)在Resource页签中,查看修改后Cookie的内容

1.2.4、Cookie生命控制

Cookie对象的.setMaxAge(  ) 方法控制Cookie的存活。

 

Cookie的默认存活时间(会话)setMaxAge为负数,表示会话级。也就是说浏览器一旦关闭,Cookie就会被删除。

Cookie的删除                                     setMaxAge 零表示马上删除。表示浏览器一收到响应,马上就会删除Cookie。

Cookie的保存                                   setMaxAge 正数表示多少秒之后删除

 

当我们创建一个新Cookie的时候。Cookie的默认存活时间为会话时间。也就是只要一关浏览器。cookie就会过期,被删除。

当我们调用setMaxAge( 0 ) 为零的时候。表示浏览器一收到响应后,就马上删除Cookie

当我们调用setMaxAge( 正页 ) 的时候,表示Cookie将在多少秒后过期。

 

 

1)图解Cookie过期时间被修改的过程:

 

 

2)修改Cookie过期时间的代码:

    protected void deleteCookie(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 获取Cookie

        Cookie[] cookies = request.getCookies();

        Cookie cookie = null;

        if (cookies != null) {

            // 查找出我们需要修改的Cookie对象

            for (Cookie c : cookies) {

                // 获取键为cookie-name的cookie对象

                if ("cookie-name".equals(c.getName())) {

                    cookie = c;

                    break;

                }

            }

        }

        if (cookie != null) {

//          负数表示浏览器关闭后删除,正数表示多少秒后删除

//          设置为零,表示立即删除Cookie

            cookie.setMaxAge(0);

            response.addCookie(cookie);

            response.getWriter().write("删除Cookie……");

        }

       

    }

 

 

3)修改html页面中的连接地址

<li><a href="cookieServlet?action=deleteCookie" target="target">Cookie立即删除</a></li>

 

修改之后,点击访问。

 

 

4)通过浏览器调试工具查看请求响应信息。和Cookie信息。

 

1.2.5、cookie路径Path设置

设置Cookie的Path路径,只需要调用Cookie对象的setPath方法即可

当我们调用setPath方法设置有效路径为/day14/abc路径

那么下面几个路径能访问到Cookie的是

/day14/abc                             能获取Cookie

/day14/xxxx.xxx                    不能获取Cookie

/day14/abc/xxx.xxx                 能获取Cookie

/day14/abc/a/b/c                   能获取Cookie

 

 

1)设置Cookie对象Path属性的代码

    protected void setPath(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

       

        // 创建一个Cookie对象

        Cookie cookie = new Cookie("cookie-path", "test");

        // 设置Cookie的有效访问路径为/day14/abc/下所有资源

        cookie.setPath(request.getContextPath() + "/abc");

        // 通知浏览器保存修改

        response.addCookie(cookie);

        response.getWriter().write("设置Cookie…的path路径");

    }

 

 

2)当我们通过浏览器访问上面的代码,响应头中会有下如下信息:

 

 

 

3)分别通过不同的路径去访问,查看浏览器的请求头,是否会携带/day14/abc 路径下Cookie

 

访问/day14/cookie.html

请求头信息

 

访问/day14/abc/a/b/c.html

请求头信息

1.4、Cookie用户名免输入练习

 

需求:第一次登录之后,一个星期内免输入用户名登录。

 

1)服务器Servlet的代码

 

    protected void login(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 获取请求参数

        String username = request.getParameter("username");

        String password = request.getParameter("password");

 

        if ("admin".equals(username) && "admin".equals(password)) {

            // 创建Cookie

            Cookie cookie = new Cookie("username", username);

            // 设置过期时间为一个星期

            cookie.setMaxAge(60 * 60 * 24 * 7);

            // 通知浏览器保存

            response.addCookie(cookie);

            response.getWriter().write("登录成功!");

        } else {

            response.sendRedirect(request.getContextPath() + "/login.jsp");

        }

    }

 

 

 

2)WebContent/login.jsp页面

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="pragma" content="no-cache" />

<meta http-equiv="cache-control" content="no-cache" />

<meta http-equiv="Expires" content="0" />

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

    <form action="cookieServlet?action=login" method="post">

        用户名:<input name="username" type="text" value="${ cookie.username.value }" /><br />

        密码:<input name="password" type="text" value="" /><br />

            <input type="submit" value="提 交" />

    </form>

</body>

</html>

 

 

 

 

1.3、Cookie的总结:

创建Cookie             

Cookie cookie = new Cookie(key,value); 默认浏览器关闭就会过期

response.addCookie( cookie ); 通知浏览器。一定要调用浏览器才收到

 

获取Cookie              request.getCookies(); 获取所有Cookie

 

修改Cookie的值   

Cookie cookie = new Cookie(key,null); 只要创建一个已经存在的Cookie

cookie.setValue( 新Value );            设置新的值

response.addCookie( cookie ); 通知浏览器修改

 

修改Cookie的有效时间。

setMaxAge( 负数 )                          表示浏览器关闭就会过期

setMaxAge( 0 )                                  表示收到响应就会过期

setMaxAge( 正数 )                          表示多少秒后过期

 

修改Cookie的Path路径

setPath( “/xxxx/xxxx” ) 设置 Cookie的有效访问路径

 

比如设置为/day14/abc,则下面几个路径访问的结果是

/day14/abc                             能获取Cookie

/day14/xxxx.xxx                    不能获取Cookie

/day14/abc/xxx.xxx                 能获取Cookie

/day14/abc/a/b/c                   能获取Cookie

2、Session会话

2.1、什么是Session?

首先Session是jsp中九大内置对象之一。

其次Session是一个域对象。

然后Session是在服务器端用来保存用户数据的一种技术。并且Session会话技术是基于Cookie实现的。

2.2、Session的使用

2.2.1、Session创建和获取(id号,是否为新)

request.getSession() 创建或获取Session对象 ( 第一次访问是创建Session对象。之后调用都是获取Session )

 

 

 

1)下面是获取Session和创建Session。以及获取Session的 ID编号,获取Session是否是新创建的示例代码:

 

package com.atguigu.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class SessionServlet extends BaseServlet {

    private static final long serialVersionUID = 1L;

 

    public SessionServlet() {

    }

 

    protected void getSession(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        System.out.println(request.getHeader("Cookie"));

       

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 输出会话id号,和是否是新创建

        // session.getId()返回Session的唯一编号

        // session.isNew()返回当前Session是否是刚创建的

        response.getWriter().write(

                "session ID:" + session.getId() + "<br/>是否是新的:" + session.isNew());

    }

}

 

 

在web.xml文件中的配置:

 

    <servlet>

        <servlet-name>SessionServlet</servlet-name>

        <servlet-class>com.atguigu.servlet.SessionServlet</servlet-class>

    </servlet>

    <servlet-mapping>

        <servlet-name>SessionServlet</servlet-name>

        <url-pattern>/sessionServlet</url-pattern>

    </servlet-mapping>

 

 

 

第一次访问的结果:

 

 

之后每次访问的结果:

 

 

 

2.2.2、Session数据的存取

Session域对象数据的存取和其他三个域对象PageContext、Request、ServletContext是一样的。只需要调用下面两个方法。

 

setAttribute 设置属性

getAttribute 获取属性

 

 

编写下面的java代码去访问,就可以在Session域中设置属性,和获取属性。

 

    protected void setAttribute(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置数据

        session.setAttribute("abc", "abc value");

        response.getWriter().write("设置属性值成功!");

    }

   

    protected void getAttribute(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置数据

        String value = (String) session.getAttribute("abc");

        response.getWriter().write("获取abc的属性值:" + value);

    }

 

 

修改session.html 中访问的连接地址,然后点击访问。

 

    <li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>

    <li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>

 

访问后效果图:

 

 

 

 

2.2.3、Session 生命周期控制

int getMaxInactiveInterval()   获取超时时间。以秒为单位。

 

setMaxInactiveInterval ( 时间 )  设置用户多长时间没有操作之后就会Session过期。以秒为单位。

如果是正数。表示用户在给定的时间内没有任意操作,Session会话就会过期。

如果是负数。表示Session永不过期。

 

 

Session默认存活时间

Session默认的过期时间为30分钟。默认是在tomcat的conf目录下web.xml配置文件中。

 

我们也可以在自己工程的web.xml文件中配置Session会话的超时时间为10分钟。

记住一点,我们在web.xml文件中配置的Session会话超时时间是对所有Session都生效的。

    <!-- 设置Session默认的过期时间  -->

<session-config>

    <!-- 以分钟为单位。10分钟超时  -->

        <session-timeout>10</session-timeout>

</session-config>

 

 

Session3秒之后超时

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置过期时间3

        session.setMaxInactiveInterval(3);

Session1分钟之后超时

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置过期时间1分钟

        session.setMaxInactiveInterval(60);

Session1小时之后超时

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置过期时间1小时

        session.setMaxInactiveInterval(60 * 60);

Session1天之后超时

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置过期时间1

        session.setMaxInactiveInterval(60 * 60 * 24);

Session1周之后超时

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置过期时间1

        session.setMaxInactiveInterval(60 * 60 * 24 * 7);

Session永远不超时

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 设置永远不超时

        session.setMaxInactiveInterval(-1);

Session马上超时(失效)

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

        // 让Session对象立即过期

        session.invalidate();

 

2.2.4、Session钝化,活化

首先我们要知道什么是钝化,什么是活化。

Session的钝化指的是Tomcat服务器在正常关闭的情况下,把Session的信息序列化到Tomcat/work/Catalina/localhost/工程名/SESSIONS.ser的二进制文件。

Session的活化指的是 Tomcat服务器在启动的时候。会把Tomcat/work/Catalina/localhost/工程名/SESSIONS.ser的二进制文件。读取到内存中,恢复Session的信息。

 

我们先创建一个User

package com.atguigu.servlet;

 

public class User {

 

    private String username;

 

    public User() {

        super();

    }

 

    public User(String username) {

        super();

        this.username = username;

    }

 

    @Override

    public String toString() {

        return "User [username=" + username + "]";

    }

 

}

 

 

然后在修改设置Session属性和获取Session属性的方法代码,添加一个User类的存取

 

然后在页面上点击 【Session域数据的存储】,和【Session域数据的获取】。

 

通过上面的图,我们发现。正常存储数据是没有问题的。那么现在,我们把服务器正常关闭,让Session钝化到硬盘。然后再启动服务器。让Session活化到内存中。然后再点击【Session域数据的获取】连接查看是否能正常获取。

 

再次点击【Session域数据的获取】我们发现,只能获取到Session域对象中的String的值,而无法获取到User的值。而控制台也报空指针异常。

这时候我们发现,其实就是获取不到User对象。那为什么String类型的值可以在活化之后获取到,而User对象在活化之后获取不到了呢。

我们去看一下String对象的类,你会发现。String对象实现了java.io.Serializable 序列化接口。

其实Session会话的钝化和活化,就是Session序列化和Session反序列化的一个过程。这其中User对象并没有实现java.io.Serializable接口。所以序列化的时候并没有把User属性序列化到硬盘上。Session活化之后,再去获取User对象的属性是获取不到数据的。所以我们修改一下User对象。让其实现java.io.Serializable接口,重启Tomcat服务器。之后再实验上面的操作。就可以获取到User对象了。

 

2.2.5、jsp中第一次访问Servlet获取Session为什么不是为新的

不知道大家还有没有印象,当我们去访问jsp页面的时候。实际上是访问Servlet程序。而且在生成的Servlet程序中有9大内置对象。这九大内置对象,在我们看到页面之前。jsp翻译的Servlet程序就已经被访问了。也就是图片中获取获取Session对象的代码早已经执行。服务器早已经给我们创建好了Session对象。供我们使用。所以之后我们再调用request.getSession方法获取到的Session对象都不是新创建的。

 

 

 

 

 

2.2.6、浏览器和Session关联的技术内幕

在前面的演示中我们发现。一旦浏览器关闭之后。我们再去获取Session对象。就会创建了一个新的Session对象。这是怎么回事呢。现在让我们来看一下。这一系列操作过程中的内幕细节。

 

 

通过上图的分析,我们不难发现。当浏览器关闭之后。只是因为浏览器无法再通知服务器,之前创建的Session的会话id是多少了。所以服务器没办法找到对应的Session对象之后,就以为这是第一次访问服务器。就创建了新的Session对象返回。

 

 

 

2.2.6、关闭浏览器后使用Session

那么,现在我们要想在浏览器关闭之后同样可以关联上之前创建的Session对象的关键就是想办法让JSESSIONID的cookie在浏览器关闭之后,不被销毁即可。也就是需要我们修改key是JSESSIONID的Cookie的存活时间,让这个Cookie在浏览器关闭之后不被销毁。

 

 

1)修改第一次创建Session对象的代码:

    protected void getSession(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

 

        // 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。

        HttpSession session = request.getSession();

       

        // 手动创建一个key是JSESSIONID的Cookie

        Cookie cookie = new Cookie("JSESSIONID", session.getId());

        // 设置一个存活时间,确保浏览器关闭后Cookie没有销毁

        cookie.setMaxAge(60 * 60 * 24);

        response.addCookie(cookie);

        // 输出会话id号,和是否是新创建

        // session.getId()返回Session的唯一编号

        // session.isNew()返回当前Session是否是刚创建的

        response.getWriter().write(

                "session ID:" + session.getId() + "<br/>是否是新的:" + session.isNew());

    }

 

2)这时候打开页面访问【Session创建和获取】

 

3)在谷歌浏览器中查看Cookie确保存活时间已被修改。

 

 

4)关闭浏览器,再打开浏览器。再访问。

 

 

2.2.7、禁用Cookie后关联Session

前面我们已经知道,只要修改JSESSIONID的Cookie的存活时间,让浏览器关闭之后,我们还是可以和Session进行关联。这中间的核心细节就是通过Cookie来实现。那么如果浏览器禁用了Cookie怎么办呢。我们就没有办法再通过Cookie来实现对Session的关联。

 

其实还有另一个办法。那就是Session ID重写到url地址中。

 

那么如何重写url的地址呢。比如原来有访问地址是 sessionServlet?action=getAttribute

那么 我们重写 session url 地址后是:sessionServlet;jsessionid=F2504A416D4BF92070BA608AF5933E5C?action=getAttribute

这样的连接,当我们发起请求的时候,jsession的id就会通过地址传到服务器。同样可以起到让服务器知道是哪一个Session的目的。

 

 

 

 

当然我们没有必要自己去写这样的一个地址。在java的api中,已经提交了这样的方法让我们直接调用就可以实现。

 

response.encodeRedirectURL() 可以重写url地址

还有另一种方法就是JSTL标签库中的 <c:url value=""></c:url> 同样可以实现Sessionurl地址重写

 

比如下面:

 

<li><a href="<c:url value="sessionServlet?action=getAttribute"></c:url>" target="target">Session域数据的存储</a></li>

 

只要通过访问重写的url地址。就可以关联上。之前创建的Session对象。而不需要再创建一个新的。

 

2.2.8、用户登录、退出--练习

需求:如果用户未登录,显示游客您好,显示登录表单。并且高级武功和绝世武功不可见。
   如果用户已登录,显示【用户名】您好,
退出功能,隐藏登录表单。全部武功可见

 

 

1)服务器代码:

package com.atguigu.servlet;

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

public class LoginServlet extends BaseServlet {

    private static final long serialVersionUID = 1L;

 

    protected void login(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 获取登录参数                                                 

        String username = request.getParameter("username");

        String password = request.getParameter("password");

        // 获取Session

        HttpSession session = request.getSession();

        if ("admin".equals(username) && "admin".equals(password)) {

            session.setAttribute("username", username);

        }

        // 转发到欢迎页面。

        request.getRequestDispatcher("/session_test.jsp").forward(request, response);

    }

   

    protected void logout(HttpServletRequest request, HttpServletResponse response)

            throws ServletException, IOException {

        // 获取Session

        HttpSession session = request.getSession();

        // 移除登录信息

        session.removeAttribute("username");

 

        // 转发到欢迎页面。

        request.getRequestDispatcher("/session_test.jsp").forward(request, response);

    }

 

}

 

 

2web.xml文件中的配置:

  <servlet>

    <servlet-name>LoginServlet</servlet-name>

    <servlet-class>com.atguigu.servlet.LoginServlet</servlet-class>

  </servlet>

  <servlet-mapping>

    <servlet-name>LoginServlet</servlet-name>

    <url-pattern>/login</url-pattern>

  </servlet-mapping>

 

 

 

3session_test.jsp页面代码:

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>Insert title here</title>

</head>

<body>

<h1 align="center">欢迎光临武林秘籍管理系统</h1>

<c:choose>

    <c:when test="${ empty sessionScope.username }">

        <h2 align="center">游客您好,如果想查看武林秘籍请登录</h2>

       

        <form action="${ pageContext.request.contextPath }/login?action=login" method="post">

            用户名:<input type="text" name="username" /><br/>

            密 码:<input type="password" name="password" /><br/>

            <input type="submit" />

        </form>

        <h3>普通武功秘籍</h3>

        <ul>

            <li><a href="level1/1.jsp">罗汉拳</a></li>

            <li><a href="level1/2.jsp">武当长拳</a></li>

            <li><a href="level1/3.jsp">全真剑法</a></li>

        </ul>

    </c:when>

    <c:otherwise>

        <h2 align="center">${ username }您好,<a href="${ pageContext.request.contextPath }/login?action=logout">退出</a></h2>

        <h3>普通武功秘籍</h3>

        <ul>

            <li><a href="level1/1.jsp">罗汉拳</a></li>

            <li><a href="level1/2.jsp">武当长拳</a></li>

            <li><a href="level1/3.jsp">全真剑法</a></li>

        </ul>

        <h3>高级武功秘籍</h3>

        <ul>

            <li><a href="level2/1.jsp">太极拳</a></li>

            <li><a href="level2/2.jsp">七伤拳</a></li>

            <li><a href="level2/3.jsp">梯云纵</a></li>

        </ul>

       

        <h3>绝世武功秘籍</h3>

        <ul>

            <li><a href="level3/1.jsp">葵花宝典</a></li>

            <li><a href="level3/2.jsp">龟派气功</a></li>

            <li><a href="level3/3.jsp">独孤九剑</a></li>

        </ul>     

    </c:otherwise>

</c:choose>

 

<div>

    需求:如果用户未登录,显示游客您好,显示登录表单。并且高级武功和绝世武功不可见。<br/>

    &nbsp;&nbsp;&nbsp;如果用户已登录,显示【用户名】您好,<a href="">退出</a>功能,隐藏登录表单。全部武功可见

</div>

 

</body>

</html>

 

 

 

 

2.3、Session的总结:

 

Session的创建 request.getSession() 第一次访问

Session的获取 request.getSession() Session创建之后的每次访问都是获取。

 

 

 

Session域数据的存取和删除

存储 session.setAttribute

获取 session.getAttribute

删除 session.removeAttribute

 

 

Session默认超时设置

Session的生命周期默认超时间是30分钟。

当然我们也可以在web.xml文件中配置所有Session的默认超时时间:

比如:

    <!-- 设置Session默认的过期时间  -->

<session-config>

    <!-- 以分钟为单位。10分钟超时  -->

        <session-timeout>10</session-timeout>

</session-config>

这是配置所有Session的超时时间为10分钟。

 

 

手动设置单个Session的超时:

session.setMaxInactiveInterval()  传入的参数是正数。表示客户端与服务器多少秒内没有通信就会Session超时。

session.setMaxInactiveInterval()  如果传入的是负数,表示Session永不超时。

 

 

Session的钝化,就是把Session对象序列化到硬盘上

Session的活化,就是把读取序列化文件恢复Session对象到内存

 

 

浏览器和服务器之间关联Session是通过Cookie技术来实现的。

Session首次创建的时候会创建一个Cookie对象,cookie的key是“JSESSIONID”,cookie的值是 Session的id号。它的默认存活时间是会话时间。也就是浏览器关闭就会销毁

 

 

关闭浏览器之后关联Session

        // 手动创建一个key是JSESSIONID的Cookie

        Cookie cookie = new Cookie("JSESSIONID", session.getId());

        // 设置一个存活时间,确保浏览器关闭后Cookie没有销毁

        cookie.setMaxAge(60 * 60 * 24);

// 通知浏览器修改

        response.addCookie(cookie);

 

禁用Cookie后关联Session

浏览器禁用Cookie之后,我们需要重写Session URL 地址。

一种方法:

response.encodeRedirectURL() 可以重写url地址

二种方法:

JSTL标签库中的 <c:url value=""></c:url> 同样可以实现Sessionurl地址重写

猜你喜欢

转载自blog.csdn.net/qq_25106373/article/details/81228215
今日推荐