写在前面:我是一个普通专科大一学生,自学了4个多月Java,JavaWeb也快到达了末端了,3月初开始了博客之路,由于时间更新的比较少,但是最近我的文章:一篇文章认识4种Java多线程的创建方式 和 HTML基础标签 -javaweb 还有 学习听说要过时的JSP技术内容 -JavaWeb篇 帮助我访客破了2000,很开心,谢谢各位的浏览与点赞,是我学习的动力!
在看这篇文章前:需要懂得Servlet的使用:JavaWeb——Servlet(全网最详细教程包括Servlet源码分析)
感谢关注,我的公众号: 小白编码。 若你喜欢可以给我点赞支持!谢谢各位。
Cookie与Session
Cookie与Session:
首先Cookie和Seesion可以用来会话控制,Cookie是在客户端使用,而Session是在服务端使用,由于HTTP协议是一种无状态协议,单方面的请求,服务端无法知道下一次的请求来自哪里(就比如你去咖啡店叫服务员来一杯咖啡,第二次再叫服务员来杯水,此时的服务员并不知道是同一个人发出的请求。这时候就需要给服务员加点印象)有了Cookie和Session一起的时候,服务器就能够知道客户端的具体来自哪里的请求。(成功让服务员知道是同一个人发出的请求)
Cookie篇:
Cookie介绍:
Cookie的英文意思是饼干,但是这不是Cookie存在的真正本意。那么Cookie是什么:
- 平时在浏览器中,登陆的账户信息,记住登陆的选项,都是可以用Cookie完成的。
- Cookie 是服务器通知客户端保存键值对的一种技术。
- 客户端有了Cookie 后,每次请求都发送给服务器。
- 每个Cookie 的大小不能超过4kb
- Cookie记录和分析用户在浏览器的行为。
Cookie的生命:
- 会话型Cookie:在客户端关闭时,Cookie会被摧毁
- 永久性Cookie:这时候的Cookie不会被酷虎端的关闭而摧毁,而是在指定的时间后被摧毁
如何使用Cookie?(java代码演示)
1.创建Cookie
在服务器中创建Cookie,并且通知web端保存Cookie。通过响应头Set-Cookie通知保存Cookie对象。(若当前Cookie存在,即修改Cookie的Value值。
Java创建Cookie方式:
1 创建Cookie 对象
2.通知客户端保存Cookie
3.通知客户端保存
Java代码演示:
public class TestCookieServlet extends BaseServlet {
//1.创建Cookie
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 1 创建Cookie 对象
Cookie cookie = new Cookie("key1", "value1");
// 2.通知客户端保存Cookie
// 3.通知客户端保存
resp.addCookie(cookie);
resp.getWriter().write("Cookie成功创建");//显示到测试的Html页面里
}
html测试:(html代码部分在下方)
2.服务器获取Cookie(获取指定Cookie)
只需要:req.getCookies():Cookie[]
Java代码部分:
//2.服务器获取Cookie
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws IOException {
//获得Cookie数组
Cookie[] cookies = req.getCookies();
//遍历Cookie
for (Cookie cookie : cookies) {
//getName返回Cookie的key
//getValue返回Cookie的Value
//写到内嵌页面
resp.getWriter().write("Cookie[" + cookie.getName() + "=" + cookie.getValue() + "] <br/>");
}
}
Html结果演示:
3.Cookie的修改
方案一:(只演示此方式)
1、先创建一个要修改的同名(指的就是key)的Cookie 对象
2、在构造器,同时赋于新的Cookie 值。
3、调用response.addCookie( Cookie );
方案二:
1、先查找到需要修改的Cookie 对象
2、调用setValue()方法赋于新的Cookie 值。
3、调用response.addCookie()通知客户端保存修改
Java代码:
//3.Cookie的修改
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws IOException {
// 1、先创建一个要修改的同名(指的就是key)的Cookie 对象
// 2、在构造器,同时赋于新的Cookie 值。
Cookie cookie = new Cookie("key1","updateVuale");
// 3、调用response.addCookie( Cookie );
resp.addCookie(cookie);
if (cookie != null) {
//通知客户端保存Cokkie
resp.getWriter().write("修改了指定的cookie");
}
}
Html部分:
4.Cookie 生命控制(只演示代码)
控制Cookie的摧毁方式
setMaxAge()
正数,表示在指定的秒数后过期
负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
零,表示马上删除Cookie
生命控制代码:
//Cookie的生命控制
@Test
public void Cookielive(){
Cookie cookie = new Cookie("life3600", "life3600");
// 正数,表示在指定的秒数后过期
cookie.setMaxAge(60 * 60); // 设置Cookie 一小时之后被删除。
// 负数,表示浏览器一关,Cookie 就会被删除(默认值是-1)
cookie.setMaxAge(-1);
// 零,表示马上删除Cookie
cookie.setMaxAge(0);
Seesion篇:
什么是Session ?
- Session 就一个接口(HttpSession)。
- Session 的出现是为了弥补Http的无状态特性。
- Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
- 每个客户端都有自己的一个Session 会话。
- Session 会话中,我们经常用来保存用户登录之后的信息。
Seesion的缺点:
-
Session变量和cookies是同一类型的。如果某用户将浏览器设置为不兼容任何cookie,那么该用户就无法使用这个Session变量
-
当一个用户访问某页面时,每个Session变量的运行环境便自动生成,这些Session变量可在用户离开该页面后仍保留20分钟!(事实上,这些变量一直可保留至“timeout”。“timeout”的时间长短由Web服务器管理员设定。一些站点上的变量仅维持了3分钟,一些则为10分钟,还有一些则保留至默认值20分钟。)所以,如果在Session中置入了较大的对象(如ADO
recordsets,connections, 等等),那就有麻烦了!随着站点访问量的增大,服务器将会因此而无法正常运行!
来源:苏州城外的微笑 https://www.bbsmax.com/A/QV5Z1qKZJy/
Session与浏览器关联的内部技术:
来自良心的某机构笔记。(国哥)
Session的使用:
1.Session的创建与获取(id 号,是否为新)
-
request.getSession()
第一次调用是:创建Session 会话
之后调用都是:获取前面创建好的Session 会话对象。 -
isNew(); 判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是ID 值。而且这个ID 是唯一的。
getId() 得到Session 的会话id 值。
Java代码演示:
protected void getSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得Session对象
HttpSession session = req.getSession();
//判断是否是新创建的
boolean aNew = session.isNew();
// 获取SessionId
String id = session.getId();
resp.getWriter().write("id:" + id + "<br/>");//回传Html页面
resp.getWriter().write("是否是新创建的?:" + aNew);
}
Html效果:
2.Session域数据的存取
-
request.getSession().setAttribute()
-
request.getSession().getAttribute()
Java代码演示:
protected void setSessionValue(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//向Session域设置键值对
req.getSession().setAttribute("key1","value");
resp.getWriter().write("保存数据");
}
protected void getSessionValue(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//获得Session域键值对信息
String key1 = (String) req.getSession().getAttribute("key1");
resp.getWriter().write(key1);
}
Html演示:
3.Session生命周期控制
-
public void setMaxInactiveInterval(int interval) 设置Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
值为正数的时候,设定Session 的超时时长。
负数表示永不超时(极少使用) -
public int getMaxInactiveInterval()获取Session 的超时时间
-
public void invalidate() 让当前Session 会话马上超时无效。
-
Session 默认的超时时长:30分钟
Java代码演示:
protected void testSessionLive(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置session10秒超时
req.getSession().setMaxInactiveInterval(10);
//获得session超时时间
int maxInactiveInterval = req.getSession().getMaxInactiveInterval();
System.out.println(maxInactiveInterval);
//销毁Session
req.getSession().invalidate();
}
BaseServlet:
public abstract class BaseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws UnsupportedEncodingException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
String action = req.getParameter("action");
try {
Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
method.invoke(this,req,resp);
} catch (Exception e) {
e.printStackTrace();
}
}
}
Cookie演示html代码:
<!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>Cookie</title>
<style type="text/css">
ul li {
list-style: none;
}
</style>
<base href="http://localhost:8080/10_cookie_session/">
</head>
<body>
<iframe name="target" width="500" height="500" style="float: left;"></iframe>
<div style="float: left;">
<ul>
<li><a href="testCookieServlet?action=createCookie" target="target">Cookie的创建</a></li>
<li><a href="testCookieServlet?action=getCookie" target="target">Cookie的获取</a></li>
<li><a href="testCookieServlet?action=updateCookie" target="target">Cookie值的修改</a></li>
</ul>
</div>
</body>
</html>
Session演示Html:
<!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>Session</title>
<base href="http://localhost:8080/10_cookie_session/">
<style type="text/css">
ul li {
list-style: none;
}
</style>
</head>
<body>
<iframe name="target" width="500" height="500" style="float: left;"></iframe>
<div style="float: left;">
<ul>
<li><a href="sessionServlet?action=getSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>
<li><a href="sessionServlet?action=setSessionValue" target="target">Session域数据的存储</a></li>
<li><a href="sessionServlet?action=getSessionValue" target="target">Session域数据的获取</a></li>
</ul>
</div>
</body>
</html>
xml配置:
<servlet>
<servlet-name>CookieServlet</servlet-name>
<servlet-class>com.servlet.web.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieServlet</servlet-name>
<url-pattern>/cookieServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>TestCookieServlet</servlet-name>
<servlet-class>com.servlet.web.TestCookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>TestCookieServlet</servlet-name>
<url-pattern>/testCookieServlet</url-pattern>
</servlet-mapping>
最后:
这就是Cookie与Session的总体内容,写得不好请见谅。谢谢支持。