hooyantsing's Blog

第66次课程_访问状态管理

字数统计: 1.7k阅读时长: 8 min
2019/10/18

源辰76班

第66次课程

2019.10.18

内容

访问状态管理[廖彦]

Cookie与Session的不同及使用方法

||Cookie|Session|

|数据存放位置|客户机|服务器| |存取方式 |Cookie中只能保管ASCII字符串,假如需求存取Unicode字符或者二进制数据,需求先进行编码。Cookie中也不能直接存取Java对象。若要存储略微复杂的信息,运用Cookie是比拟艰难的。 |Session中能够存取任何类型的数据,包括而不限于String、Integer、List、Map等。Session中也能够直接保管Java Bean乃至任何Java类,对象等,运用起来十分便当。能够把Session看做是一个Java容器类。 |
|隐私策略 |假如选用Cookie,比较好的方法是,敏感的信息如账号密码等尽量不要写到Cookie中。最好是像Google、Baidu那样将Cookie信息加密,提交到服务器后再进行解密,保证Cookie中的信息只要本人能读得懂。
Cookie存储在客户端阅读器中,对客户端是可见的,客户端的一些程序可能会窥探、复制以至修正Cookie中的内容。|假如选择Session就省事多了,反正是放在服务器上,Session里任何隐私都能够有效的保护。
Session存储在服务器上,对客户端是透明的,不存在敏感信息泄露的风险。 |
|有效期 |使用过Google的人都晓得,假如登录过Google,则Google的登录信息长期有效。用户不用每次访问都重新登录,Google会持久地记载该用户的登录信息。要到达这种效果,运用Cookie会是比较好的选择。只需要设置Cookie的过期时间属性为一个很大很大的数字。 |由于Session依赖于名为JSESSIONID的Cookie,而Cookie JSESSIONID的过期时间默许为–1,只需关闭了阅读器该Session就会失效,因而Session不能完成信息永世有效的效果。运用URL地址重写也不能完成。而且假如设置Session的超时时间过长,服务器累计的Session就会越多,越容易招致内存溢出。|
|服务器压力 |Cookie保管在客户端,不占用服务器资源。假如并发阅读的用户十分多,Cookie是很好的选择。关于Google、Baidu、Sina来说,Cookie或许是唯一的选择。 |Session是保管在服务器端的,每个用户都会产生一个Session。假如并发访问的用户十分多,会产生十分多的Session,耗费大量的内存。因而像Google、Baidu、Sina这样并发访问量极高的网站,是不太可能运用Session来追踪客户会话的。 |
|跨域支持 |Cookie支持跨域名访问,例如将domain属性设置为“.biaodianfu.com”,则以“.biaodianfu.com”为后缀的一切域名均能够访问该Cookie。跨域名Cookie如今被普遍用在网络中,例如Google、Baidu、Sina等。 |Session则不会支持跨域名访问。Session仅在他所在的域名内有效。 |

login.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
<%@ 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="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<h1>登录系统</h1>
<%
//从请求对象中获取 浏览器 发送回服务器的 cookie 数据
Cookie[] cookies = request.getCookies();
Cookie loindeUserCookie = null;
if(cookies!=null){
for(Cookie cookie:cookies){
if("loginedUser".equals(cookie.getName())){
loindeUserCookie = cookie;
break;
}
}
}
%>
URL:127.0.0.1/191013_Tomcat/1018/login.jsp<br>
会话ID:<%=session.getId() %>
<form action="dologin.jsp">
<%if(request.getAttribute("msg")!=null){ %>
<font color="red">
<%=request.getAttribute("msg") %>
</font><br>
<%} %>
账户:<input name="username"
value="<%=loindeUserCookie == null ? "" : loindeUserCookie.getValue() %>"><br>
密码:<input name="password"><br>
有效期:
<select name="maxAge">
<option value="0">忘了我吧</option>
<option value="60">一分钟</option>
<option value="86400">一天</option>
<option value="604800">一周</option>
<option value="2592000">一月</option>
<option value="9999999">永远</option>
</select><br>
<input type="submit" value="登录"><br>
</form>
</body>
</html>

dologin.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<%@ 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="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
String username = request.getParameter("username");
String password = request.getParameter("password");
int maxAge = Integer.parseInt(request.getParameter("maxAge"));
if("yc".equals(username) && "123".equals(password)){
//创建一个Cookie对象,发给浏览器保存下来
Cookie cookie = new Cookie("loginedUser",username); //在本地保存,使用cookie
//设置cookie有效期,单位 秒
cookie.setMaxAge(maxAge);
//将cookie添加到响应对象中
response.addCookie(cookie);

//登录成功后,使用会话对象保存登录状态
session.setAttribute("loginedUser", username); //在服务器保存,使用session
response.sendRedirect("home.jsp");
}else{
request.setAttribute("msg", "用户名或密码错误!");
request.getRequestDispatcher("login.jsp").forward(request, response);
}
%>
</body>
</html>

home.jsp

权限控制

1
<%@ 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="Content-Type" content="text/html; charset=utf-8"><title>Insert title here</title></head><body><h1>Hello</h1><%    //访问权限控制    if(session.getAttribute("loginedUser")==null){       request.setAttribute("msg", "请先登录系统");       request.getRequestDispatcher("login.jsp").forward(request, response);       return;    }%><h2>欢迎:<%=session.getAttribute("loginedUser") %>    <a href="dologout.jsp">退出</a></h2></body></html>

dologinout.jsp

登出、退出登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<%@ 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="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%
//账户登出功能
//实现退出 方法一
session.removeAttribute("loginedUser");
//实现退出 方法二:直接将当前会话对象失效(失效有两种:1.手动失效 2.自动失效(30min))
session.invalidate();

//跳转至登录页面
response.sendRedirect("login.jsp");
%>
</body>
</html>
CATALOG