1 Cookie基本概念
Cookie(客户端,不是内置对象[所以要new]): Cookie是由 服务端生成的,再发送给客户端保存
- 相对于 本地缓存的作用:客户端->服务端
- 就比如你看一个hello.mp4,第一次看的时候由服务端生成,并发送给客户端,第二次再看的时候本地已经有保留
- 作用:提高访问服务端的效率,但是缺点安全性较差(比如存了用户名、密码)
2 提供常用的方法:
Cookie
: name=valuepublic Cookie(String name,String value)
//由javax.servlet.http.Cookie
这个类产生Cookie对象String getName()
获取nameString getValue()
获取valuevoid setMaxAge(int expiry);
//最大有效期(秒)
3 具体实例
- 服务端准备Cookie
response.addCookie(Cookie cookie)
- 页面跳转(转发、重定向)
- 客户端获取cookie:
request.getCookies();
注意:
1.服务端增加cookie:response对象,客户端获取对象:request对象
2.不能直接获取某一个单独对象,只能一次性将全部的cookie拿到
- 通过F12可以发现 除了自己设置的Cookie对象外,还有一个name为 JSESSIONID的cookie
- 建议 cookie只保存 英文数字,否则需要进行编码、解码。
4 用途
通常使用Cookie实现 记住用户名功能
【查看Cookie】 - Cookie确实在本机
使用Cookie实现 记住用户名 功能
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
<title>register.jsp--cookie</title>
</head>
<body>
<%!
String uname;
%>
<%
boolean flag = false;
Cookie[] cookies = request.getCookies();
for (Cookie cookie: cookies) {
if (cookie.getName().equals("uname")) {
uname = cookie.getValue();
flag = true;
}
}
if (!flag) {
out.print("cookie已失效");
} else {
out.print("cookie:" + uname);
}
%>
<form action="check.jsp" method="POST">
用户名:<input type="text" name="uname" id="" value="<%=(uname==null?"":uname)>"><br>
密码:<input type="password" name="upwd" id=""><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 lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
<title>check.jsp--cookie</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
//将用户名 加入到Cookie中
Cookie cookie = new Cookie("name", name);
cookie.setMaxAge(10); //10秒
response.addCookie(cookie);
response.sendRedirect("A.jsp");
%>
</body>
</html>
1 概念:session(服务端,是内置对象)
session 又称: 会话
[例]
- 浏览网站 开始-关闭
- 购物 浏览、付款、退出
- 电子邮件 浏览、写邮件、退出
开始-结束
2 session机制:
- 客户端第一次请求服务端时,服务端会产生一个session对象(用于保存该客户的信息)
并且每个session对象 都会有一个唯一的sessionID(用于区分其他session) - 服务端 会产生一个cookie,并且 该cookie的name=JSESSIONID,value=服务端sessionID的值:
- 然后 服务端会在 响应客户端的同时 将该cookie发送给客户端,客户端就有了一个cookie(JSESSION)
- 因此,客户端的cookie就可以和服务端的sessionID一一对应(JSESSIONID-sessionID)
- 客户端第二/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID 去服务端的session中匹配sessionid,如果匹配成功,说明此用户不是第一次登录,无需登录
- session在登录时,分配sessionId
[总结] session:
- session存储在服务端
- session是在同一个用户(客户)请求时 共享
- 实现机制:第一次客户请求时 产生一个sessionid 并复制给 cookie的jsessionid 然后发给客户端。最终通过session的sessionid-cookie的jsessionid
3 session方法:
getId()
: 获取sessionId //不一定全为数字,是字符串
boolean isNew()
: 判断是否是新用户(第一次访问)
void invalidate()
: 使session失效(退出登入、注销)
void setAttribute()
Object getAttribute()
void setMaxInactiveInterval(秒)
:设置最大有效非活动时间
int getMaxInactiveInterval()
: 获取最大有效 非活动时间
示例
login.jsp
check.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
<title>check.jsp--cookie</title>
</head>
<body>
<%
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("uname");
String pwd = request.getParameter("upwd");
if (name.equals("zs") && pwd.equals("abc")) {
//登录成功
session.setAttribute("uname", name);
session.setAttribute("upwd", pwd);
//session.setMaxInactiveInterval(10); //10秒
request.getRequestDispatcher("welcome.jsp").forward(request, response);
} else {
//登录失败,跳回登录页面
request.sendRedirct("login.jsp");
}
%>
</body>
</html>
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
<title>register.jsp--response</title>
</head>
<body>
欢迎你:
<%
String name = (String)session.getAttribute("uname"); //返回的类型是Object
//用户没有登录,而是直接通过地址栏 访问welcome.jsp,则必然获取到的name是null
if (name != null) {
out.print(name);
} else { //如果没有登录,应该跳转登录页面
request.sendRedirct("login.jsp");
}
%>
</body>
</html>
注销
welcome.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html"; charset="UTF-8">
<title>register.jsp--response</title>
</head>
<body>
欢迎你:
<%
String name = (String)session.getAttribute("uname");
//用户没有登录,而是直接通过地址栏 访问welcome.jsp,则必然获取到的name是null
if (name != null) {
out.print(name);
%>
<a href="invlidate.jsp">注销</a>
<%
} else { //如果没有登录,应该跳转登录页面
request.sendRedirct("login.jsp");
}
%>
</body>
</html>
客户端在第一次请求服务端时,如果服务端发现 此请求没有JSESSIONID,则会创建一个 name=JSESSIONID的cookie,并返回给客户端
[注]Cookie
- 不是内置对象,要使用必须new
- 但是,服务端会自动生成一个(服务端自动new一个cookie) name=JSESSIONID的cookie,并返回给客户端
request:只在同一次请求有效
地址栏回车(发出第二次请求)
如果点击F5刷新,则浏览器会自动重复刚才的行为
cookie和session的区别:
----- | session | cookie |
---|---|---|
保存的位置 | 服务端 | 客户端 |
安全性 | 服务端 | 客户端 |
保存的内容 | Object | String |
[注]
- 类 -
ctrl
- 对象 -
ctrl+t
application 全局对象
String getContextPath()
虚拟路径String getRealPath(String name)
绝对路径(虚拟路径 相对的绝对路径)
四种范围对象(从小到大)
pageContext
JSP页面容器 当前页面有效request
请求对象 同一次请求有效session
会话对象 同一次会话有效application
全局对象 全局有效(整个项目有效)
以上4个对象共有的方法
Object getAttribute(String name)
: 根据属性名,获取属性值。void setAttribute(String name,Object obj)
: 设置属性值(新增或修改)setAttribute(“a”,“b”);
//如果a对象之前不存在,则新建一个a对象;如果a之前已经存在,则将a的值改为b。void removeAttribute(String name);
根据属性名,删除对象。
- pageContext:当前页面有效(页面跳转后无效)
- request:同一次请求有效,其他请求无效(请求转发后有效,重定向后无效)
- session:同一次会话有效(无论怎么跳转都有效,关闭/切换浏览器后无效,从登录到退出之前全部都有效)
- application:全局变量,整个项目运行期间都有效(切换浏览器仍然有效);关闭服务、其他项目 无效
- ==> 多个项目共享、重启后仍然有效:JNDI
- 以上的4个范围对象,通过
setAttribute()
赋值,通过getAttribute()
取值; - 以上范围对象,尽量使用最小的范围,因为对象范围越大,造成的性能损耗越大。