概述
1、Cookie饼干
1.1、什么是Cookie?
Cookie,翻译是小饼的意思。它是一种服务器告诉浏览器以键值对形式存储小量信息的技术。
1.2、Cookie的使用
1.2.1、Cookie的创建
- 先创建一个Servlet编写创建Cookie的代码,
- 然后打开浏览器访问Servlet程序。
- 按下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的获取
- 编写好获取Cookie的代码
- 修改html连接,点击访问
- 打开浏览器工具查看HTTP协议内容
- 查看服务器代码获取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值的修改
- 在Servlet中添加修改Cookie值的代码
- 修改html页面中修改cookie的连接,并访问
- 打开浏览器的调试工具查看,请求头和响应头中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>
Session在3秒之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为3秒
session.setMaxInactiveInterval(3);
Session在1分钟之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1分钟
session.setMaxInactiveInterval(60);
Session在1小时之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1小时
session.setMaxInactiveInterval(60 * 60);
Session在1天之后超时
// 第一个调用就是获取一个新的Session。如果Session已经创建过。就获取原来的会话。
HttpSession session = request.getSession();
// 设置过期时间为1天
session.setMaxInactiveInterval(60 * 60 * 24);
Session在1周之后超时
// 第一个调用就是获取一个新的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> 同样可以实现Session的url地址重写
比如下面:
<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);
}
}
2)web.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>
3)session_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/>
如果用户已登录,显示【用户名】您好,<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> 同样可以实现Session的url地址重写
最后
以上就是典雅白猫为你收集整理的java学习笔记——javaweb之cookie 与 session1、Cookie饼干2、Session会话的全部内容,希望文章能够帮你解决java学习笔记——javaweb之cookie 与 session1、Cookie饼干2、Session会话所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复