summarize
session就是专门存服务器的 一个客户端一个区域,Http一共三个域,session能存中文,cookie不能存中文
学习session 主要考虑三个问题 :1 怎样获得 2.怎样存取 session对象(内存区域) 3.session对象生命周期
客户端端不同 JSESSIONID就不同,一个客户端只能存在一个session,清理了缓存后,JSESSIONID会从新导入
创建和访问session的顺序是 先设置 在获取,当关闭客户端后,在访问,就获取不到了,显示空指针
session持久化:跟Cookie一样:从新建一个设置时间的session头 覆盖原来的session
JSP:它本身就是一个Servlet。第一行
jsp有三大指令:① page(最常用) ② include(一个页面包含另一个页面) ③ taglib 搭配jstl标签使用
language:声明jsp只能嵌套 java语言。contenType:解决response中文乱码,pageEncoding:当前jsp页面的中文乱码。属性session:默认true
原理图
1.获得Session对象
HttpSession session = request.getSession();
此方法会获得专属于当前会话的Session对象,如果服务器端没有该会话的Session 对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)
2.向session存取数据(session也是一个域对象)
三个方法:
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
packagecom.oracle.demo01;//创建Session向里面存数据
importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.Cookie;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;public class SessionServlet extendsHttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//获取Session对象
HttpSession session=request.getSession();//向session域中存储数据
session.setAttribute("goods","奶瓶");//获取JSESSIONID
String id=session.getId();//创建Cookie
Cookie cookie=new Cookie("JSESSIONID",id);
cookie.setPath("/WEB08");
cookie.setMaxAge(60);//设置持久化时间//发送Cookie
response.addCookie(cookie);
response.getWriter().write("JSESSIONID:"+id);
}public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}---------------------------------------------
packagecom.oracle.demo01;//获取Session对象的内容
importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importjavax.servlet.http.HttpSession;public class Servlet02 extendsHttpServlet {public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//获取Session对象
HttpSession session=request.getSession();//这里获取的是内存里的session//获取session中的内容 这里getattribute得到obj 需要向下转型(强转)
String goods=(String)session.getAttribute("goods");//解决乱码
response.setContentType("text/html;charset=utf-8");
response.getWriter().write(goods);
}public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {
doGet(request, response);
}
}
获取session内容的原理是,先打开已经设置好的session,然后在获取,当客户端关闭后,session的值就消失,因为
获取的内容已关闭,空指针无法强转 只会显示空指针
3.Session对象的生命周期(面试题/笔试题)
创建:第一次执行request.getSession()时创建
销毁:
1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)
问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时
可以在工程的web.xml中进行配置
30
3)手动销毁session
session.invalidate();
设置登录验证码
1
2 pageEncoding="UTF-8"%>
3
4
5
6
7
会员登录8
9
10
11
12
13
14
15 body {16 margin-top: 20px;17 margin: 0auto;18 }19
20 .carousel-inner .item img {21 width: 100%;22 height: 300px;23 }24
25 .container .row div {26 /*position:relative;27 float:left;*/
28
29 }30
31 font {32 color: #666;33 font-size: 22px;34 font-weight: normal;35 padding-right: 17px;36 }37
38
39 function change(node){ /*node是 自定义*/
40 node.src="/Shop/CheckImgServlet?time="+newDate().getTime();41 }42
43
44
45
46
47
48
49
50
51 style="width: 100%; height: 460px; background: #FF2C4C url('images/loginbg.jpg') no-repeat;">
52
53
54
55
56
57
58
60 会员登录USER LOGIN61
62
63
64
65 用户名
66
67
68 placeholder="请输入用户名" name="username">
69
70
71
72 密码
73
74
75 placeholder="请输入密码" name="password">
76
77
78
79 验证码
80
81
82 placeholder="请输入验证码" name="checkcode">
83
84
85
86
87
88
89
90
91 自动登录92 记住用户名94
95
96
97
98
99
100
101 style="background: url('./images/login.gif') no-repeat scroll 0 0 rgba(0, 0, 0, 0); height: 35px; width: 100px; color: white;">
102
103
104
105
106
107
108