JSP中cookie、session及实例
Cookie
定义
- Cookie(客户端,不是内置对象):Cookie是由服务端产生的,再发送给客户端保存。相当与本地缓存的作用:客户端(hello.mp4; zs/abc )→服务端(hello.mp4; zs/abc )
- 作用:提高访问服务端的效率,但安全性较差
- 用法:cookie: key = value
要求 | 实现 |
---|---|
所在的类 | javax.servlet.http.Cookie |
构造方法 | public Cookie(String key, String value) |
获取name | String getName() |
获取value | String getValue() |
设置最大有效期(秒) | void setMaxAge(int expiry) |
流程
- 服务端准备Cookie:response.addCookie(Cookie cookie)
- 页面跳转到客户端(转发,重定向)例如:response.sendRedirect(“A.jsp”); 其中A.jsp为客户端
- 客户端获取cookie:request.getCookies()
注意点
- 通过网页F12可以发现 除了自己设置的Cookie对象之外,还有一个name为JSESSIONID的cookie。
- 建议cookie只保存英文和数字,否则需要进行编码、解码。
- 服务端增加cookie:response.addCookie();
- 客户端获取cookie: request.getCookies();
- 不能获取某一个单独对象,只能一次性将全部的cookie拿到。
- 客户端在第一次请求服务器时,如果服务器发现此请求没有JSESSIONID,则会创建一个name=JSESIONID的cookie并返回客户端。
- Cookie不是内置对象,要使用必须new,但是服务端会自动生成一个(服务端自动new一个cookie)name=JSESIONID的cookie,并返回给客户端。
Cookie实例(记住账号)
客户端登录界面(login.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%!
String uname;
%>
<%
Cookie[] cookies = request.getCookies();
for(Cookie cookie: cookies){
if(cookie.getName().equals("uname")){
uname = cookie.getValue();
}
}
%>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname" value="<%=(uname==null?"":uname)%>"><br/>
密码:<input type="password" name="upwd"><br/>
<input type="submit" value ="登录" >
</form>
</body>
</html>
服务端检查页面(check.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
Cookie cookie = new Cookie("uname",name);
response.addCookie(cookie);
response.sendRedirect("A.jsp");
//请求转发 可以获取到数据 并且地址栏也没有发生改变 仍然保留检查的页面
// 请求转发 重定向
%>
</body>
</html>
跳转客户端页面(A.jsp):
```javascript
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
客户端页面(A.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
</body>
</html>
session
定义
session: 会话
a.浏览网站:开始——关闭
b.购物:浏览、付款、退出
a.电子邮件:浏览、写邮件、退出
即:开始 —— 结束
机制
- 客户端第一次请求服务端时:(JSESSIONID —— sessionID)
(1) 客户端会产生一个session对象(用于保存该客户的信息);并且每个session对象都会有一个唯一的sessionId(用于区分其他session);
(2) 服务端会产生一个cookie,并且该cookie的name=JSESSIONID,value=服务端sessionId的值;
(3) 然后服务端会在响应客户端的同时将该cookie发送给客户端,至此客户端就有了一个cookie(JSESSIONID);
(4) 因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID —— sessionID) - 客户端第二/N次请求服务端时:服务端会先用客户端cookie中的JSESSIONID去服务端的session中匹配sessionid,如果匹配成功(cookie JSESSIONID 和 session sessionid ),说明此用户不是第一次访问,无需登录;
- 特点:
a: session存储在服务端;
b: session是在同一个用户(客户)请求时 共享;
c: session实现机制:第一次客户请求时,产生一个sessionid并复制给cookie的jsessionid然后发给客户端。最终通过session的sessionid和cookie的jsessionid进行比较,实现一一对应的关系。
d: 同一次会话共享
用法
要求 | 实现 |
---|---|
获取sessionid | String getId() |
判断是否是新用户(第一次访问) | boolean isNew() |
使session失效(退出登录、注销) | void invalidate() |
void setAttribute() | |
Object getAttribute() | |
设置最大有效非活动时间(秒) | void setMaxInactiveInterval(秒) |
获取最大有效非活动时间(秒) | int getMaxInactiveInterval(秒) |
session实例(登录功能)
客户端登录界面(login.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname"><br/>
密码:<input type="password" name="upwd"><br/>
<input type="submit" value ="登录" >
</form>
</body>
</html>
服务端检查页面(check.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%
request.setCharacterEncoding("utf-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if(name.equals("zs")&&pwd.equals("123")){
//只有登录成功,session中才会存在uname/upwd
session.setAttribute("uname", name);
//session.setMaxInactiveInterval(10);
session.setAttribute("upwd", pwd);
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}else{
//登录失败
response.sendRedirect("login.jsp");
}
//请求转发 可以获取到数据 并且地址栏也没有发生改变 仍然保留检查的页面
// 请求转发 重定向
%>
</body>
</html>
服务端用户核对界面(welcome.jsp)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
欢迎您:
<%
String name = (String)session.getAttribute("uname");
//如果用户没有登录,而是直接通过地址栏访问welcome.jsp,则必然获取的是name是null
//如果没有登录,应该跳回到登录页
if(name!=null){
out.print(name);
}else{
response.sendRedirect("login.jsp");
}
%>
</body>
</html>
同一次会话服务端其他界面(a.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<%=
session.getAttribute("uname")
%>
</body>
</html>
Cookie和session的区别
Cookie | session | |
---|---|---|
保存的位置 | 客户端 | 服务端 |
安全性 | 较不安全 | 较安全 |
保存的内容 | String | Object |