开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
response、请求转发和重定向、cookie
1.response:响应对象
提供的方法:
void addCookie(Cookie cookie);服务端向客户端增加cookie对象
void sendRedirect(String location) throw IOException;:页面跳转的一种方式(重定向)
void setContentType(String type):设置服务端响应时的编码(设置服务端的contentType类型)
示例:登陆
login.jsp(登陆页面)->check.jsp(判断是否合法)->success.jsp
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"></input><br/>
密码:<input type="password" name="upwd"></input><br/>
<input type="submit" value="登陆"></input><br/>
</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("张三")&&pwd.equals("abcd")){
//response.sendRedirect("success.jsp");页面跳转:重定向,导致数据丢失
//页面跳转:请求转发,可以获取到数据,并且地址栏没有改变(仍然保留转发时的页面check.jsp)
request.getRequestDispatcher("success.jsp").forward(request, response);
}else{
//登陆失败
out.print("用户名或密码有误");
}
%>
</body>
</html>
success.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>
<h1>
登陆成功! 欢迎您😊:
<%
String name=request.getParameter("uname");
out.print(name);
%>
</h1>
</body>
</html>
| 请求转发 | 重定向 | |
|---|---|---|
| 地址栏是否改变 | 不变(check.jsp) | 改变(success.jsp) |
| 是否保留第一次请求时的数据 | 保留 | 不保留 |
| 请求的次数 | 1 | 2 |
| 跳转发生的位置 | 服务端 | 客户端发出的第二次跳转 |
保留与否----四种范围对象
转发、重定向
转发:
张三(客户端)—>【服务窗口A(服务端)—>服务窗口B】
<—返回值
重定向:
张三(客户端)—>服务窗口A
<—去找B
—>服务窗口B
—>返回值
2.session(服务端)
Cookie(客户端,不是内置对象,需要new):Cookie是由服务端生成的,再发送给客户端保存。
相当于本地缓存的作用:客户端(hello.mp4;zc/abc)—>服务端(hello.mp4;zc/abc) 作用:提高访问服务端的效率,但安全性较差。
Cookie:name=value(kv对,name就是key)
由javax.servlet.http.Cookie类产生的对象
构造方法:public Cookie(String name,String value)
String getName():获取name
String getValue():获取value
void setMaxAge(int exipry);最大有效期(秒)
服务端准备Cookie:
response.addCookie(Cookie cookie)
页面跳转(转发,重定向)
客户端获取Cookie:request.getCookies();
a.服务端增加Cookie:response对象;客户端获取对象:request对象
b.不能直接获取某一个单独对象,只能一次性将全部的Cookie拿到
response_addCookie.jsp:
<%@page import="com.sun.corba.se.spi.orbutil.fsm.Guard.Result"%>
<%@ 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>
<%
//服务端
Cookie cookie1=new Cookie("name","zs");
Cookie cookie2=new Cookie("pwd","abcd");
response.addCookie(cookie1);
response.addCookie(cookie2);
//页面跳转到客户端
response.sendRedirect("result.jsp");
%>
</body>
</html>
result.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>
<%
//客户端
Cookie[] cookies=request.getCookies();
for(Cookie cookie:cookies){
out.print(cookie.getName()+"--"+cookie.getValue()+"<br/>");
}
%>
</body>
</html>
通过F12可以发现,除了自己设置的Cookie对象,还有一个name为JSESSIONID的cookie
建议Cookie只保存英文和数字,否则需进行编码、解码
3.使用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 myname;
%>
<%
boolean flag=false;
Cookie[] cookies=request.getCookies();
for(Cookie cookie:cookies){
if(cookie.getName().equals("uname")){
myname=cookie.getValue();
flag=true;
}
}
if(flag){
out.print("cookie:"+myname);
}else{
out.print("cookie已失效");
}
%>
<form action="check.jsp" method="post">
用户名:<input type="text" name="uname" value="<%=(myname==null?"":myname)%>"></input><br/>
密码:<input type="password" name="upwd"></input><br/>
<input type="submit" value="登陆"></input><br/>
</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 cookie=new Cookie("uname",name);
cookie.setMaxAge(20);
response.addCookie(cookie);
response.sendRedirect("A.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>
</body>
</html>
4.session:会话
a.浏览网站:开始—>关闭
b.购物:浏览—>付款—>退出
c.电子邮件:浏览—>写邮件—>退出
开始—结束
session机制
客户端第一次请求服务端时(尝试JSESSIONID与sessionId的匹配,JSESSIONID不存在),服务端会产生一个session对象(用于保存该客户的信息);
并且每个session对象都会有一个唯一的sessionId(用于区分其他session);
服务端又会产生一个Cookie,并且该Cookie的name=JSESSIONID,value=服务端sessionId的值;
然后,服务端会在响应客户端的同时,将该cookie发送给客户端,至此客户端就有了一个cookie(JSESSIONID);
因此,客户端的cookie就可以和服务端的session一一对应(JSESSIONID--sessionId)
客户端第二/n次请求服务端时:服务端会先用客户端cookie中的JSESSIONID去服务端的session中匹配sessionid,如果匹配成功(cookie jessionid和session sessionid),说明此用户不是第一次访问,无需登录;
例子:
客户端: 顾客(客户端)
服务端:存包处 - 商场(服务端)
顾客第一次存凶包:商场判断此人是否之前存过包(通过手里是否有钥匙)
如果是新顾客(没钥匙),分配一把钥匙给顾客;钥匙和柜子一一对应;
第二/n次存包:商场判断此人是否之前存过包(通过手里是否有钥匙)
如果是老顾客(有钥匙),则不需要分配;该顾客手里的钥匙会和柜子一一对应
session:
a.session:存储在服务端
b.session是在同一个用户(客户)请求时共享
c.实现机制:第一次客户请求时产生一个sessionid并复制给cookie的jsessionid然后发给客户端。最终通过session的sessionid一一对应
session方法
String getId():获取sessionId
boolean isNew():判断是否是新用户(第一次访问)
void invalidate():使session失效
void setAttribute()
<%session.setAttribute("uname", name);%>
将name的值放到seesion的属性uname里
Object getAttribute();
void setMaxInactiveInterval(秒):设置最大有效非活动时间
int getMaxInactiveInterval():获取最大有效非活动时间
示例:
登录
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"></input><br/>
密码:<input type="password" name="upwd"></input><br/>
<input type="submit" value="登录"></input><br/>
</form>
</body>
</html>
check.jsp
<%@page import="javafx.scene.control.Alert"%>
<%@ 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("张三")&&pwd.equals("abc")){
//只有登录成功,session中才会有myname和mypwd
session.setAttribute("myname", name);
session.setAttribute("mypwd", pwd);
session.setMaxInactiveInterval(10);
request.getRequestDispatcher("welcome.jsp").forward(request,response);
}else{
//out.print("<script type='text/javascript'>alert('登录失败');</script>");//登录失败
request.getRequestDispatcher("login.jsp").forward(request,response);
}
%>
</body>
</html>
welcom.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("myname");
if(name==null){
response.sendRedirect("login.jsp");
}else{
out.print(name+"欢迎您");
}
%>
欢迎你
</body>
</html>