一、Cookie
特点:Cookie技术:会话数据保存在浏览器客户端。
1、 Cookie技术核心
Cookie类:用于存储会话数据
1)构造Cookie对象
Cookie(String name, String value)
2)设置cookie
void setPath(java.lang.String uri) :设置cookie的有效访问路径
void setValue(java.lang.String newValue) :设置cookie的值
void setMaxAge(int expiry) : 设置cookie的有效时间
正整数:表示cookie数据保存浏览器的缓存目录(硬盘中),数值表示保存的时间。
负整数:表示cookie数据保存浏览器的内存中。浏览器关闭cookie就丢失了!!
零:表示删除同名的cookie数据
3)发送cookie到浏览器端保存
void response.addCookie(Cookie cookie) : 发送cookie
4)服务器接收cookie
Cookie[] request.getCookies() : 接收cookie(浏览器返回的cookie)
2、Cookie原理
1)服务器创建cookie对象,把会话数据存储到cookie对象中。
new Cookie("name","value");
2) 服务器发送cookie信息到浏览器
response.addCookie(cookie);
举例: set-cookie: name=eric (隐藏发送了一个set-cookie名称的响应头)
3)浏览器得到服务器发送的cookie,然后保存在浏览器端。
4)浏览器在下次访问服务器时,会带着cookie信息
举例: cookie: name=eric (隐藏带着一个叫cookie名称的请求头)
5)服务器接收到浏览器带来的cookie信息
request.getCookies();
保存Cookie
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>保存Cookie</h1>
<%
Cookie cookie = new Cookie("aaa","AAA");
response.addCookie(cookie);
Cookie cookie2 = new Cookie("bbb","BBB");
response.addCookie(cookie2);
%>
</body>
</html>
获取Cookie
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h1>获取Cookie</h1>
<%
Cookie[] cookies = request.getCookies();
if (cookies != null){
for (Cookie c:cookies) {
out.println(c.getName()+"="+c.getValue());
out.print("<br>");
}
}
%>
</body>
</html>
二、HttpSession
Session特点:会话数据保存在服务器端。(内存中)
session是jsp的内置对象之一
1、HttpSession域相关方法
void setAttribute(java.lang.String name, java.lang.Object value)
保存数据
java.lang.Object getAttribute(java.lang.String name)
获取数据
void removeAttribute(java.lang.String name)
清除数据
注意
request.getSession(false)
如果session缓存中(如果Cookie不存在),不存在session,那么返回null,而不会创建session对象
2、HttpSession的其他方法
void setMaxInactiveInterval(int interval)
设置session的有效时间,默认30分服务器自动回收
全局修改session有效时间
<!-- 修改session全局有效时间:分钟 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
void invalidate()
销毁session对象
java.lang.String getId()
得到session编号
登录案例
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//处理中文问题
resp.setCharacterEncoding("utf-8");
//获取表单数据
String username = req.getParameter("username");
String password = req.getParameter("password");
//校验用户名和密码是否正确
if (!"itcast".equalsIgnoreCase(username)){
/**
* 把用户名保存在Cookie中发送到客户端浏览器
* 当再次打开login.jsp,login.jsp会读取Cookie并把它显示到用户名文本框中
*/
Cookie cookie = new Cookie("uname",username);//创建Cookie
cookie.setMaxAge(60*60);//设置Cookie命长为一个小时
resp.addCookie(cookie);//保存Cookie
/**
*如果成功,保存登录信息到session中
* 重定向到succ1.jsp
*/
HttpSession session = req.getSession();//获取session
session.setAttribute("username",username);//保存信息到session域
resp.sendRedirect("/JavaWeb_1/Session/succ1.jsp");//重定向
}else{
/**
* 如果失败,保存错误信息到request域中
* 转发到login.jsp页面
*/
req.setAttribute("msg","用户名或者密码错误");
RequestDispatcher qr = req.getRequestDispatcher("/Session/login.jsp");//得到转发器
qr.forward(req,resp);//转发
}
}
}
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<%--本页面提供登录表单,还要显示错误信息--%>
<h1>登录</h1><br>
<%
/**
* 读取名为uname的Cookie
*/
String uname = "";
Cookie[] cs = request.getCookies();//获取到所有Cookie
for (Cookie c: cs) {//循环遍历所有的Cookie
if ("uname".equals(c.getName())){
uname = c.getValue();
}
}
%>
<%
String message = "";
String msg = (String) request.getAttribute("msg");//获取request域中名为msg的属性的值
if (msg != null){
message = msg;
}
%>
<font color="red"><b><%= message %></b></font>
<form action="/JavaWeb_1/LoginServlet" method="post">
<%-- 把Cookie中的用户名显示到用户名文本中--%>
用户名<input type="text" name="username" value="<%=uname%>"><br>
密 码<input type="password" name="password"><br>
<input type="submit" value="登录">
</form>
</body>
</html>
网友评论