会话技术
从打开一个浏览器访问某个站点开始,到关闭浏览器的整个过程,称为一次会话。
会话技术的分类:
Cookie:数据保存到客户端本地,减轻服务器的压力,不安全,客户端可以管理(可以清除)。Cookie还有数量和大小的限定
Session:数据保存到服务器,安全性较好,增加服务器的压力,Session没有大小和数量的限定
Cookie
一:服务器获取Cookie的信息
//从服务器获取客户端的cookie值
Cookie[] cookies = request.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName());//获取Cookie的name值
System.out.println(cookie.getValue());//获取Cookie的value值
}
二:服务器发送一个Cookie到客户端
// 1.创建cookie对象
Cookie cookie = new Cookie("name", "wym");
// 2.设置有效时间 单位s
cookie.setMaxAge(60);
// 3.设置有效路径
cookie.setPath("/web_cookie");//访问某个站点
cookie.setPath("/web_cookie/CookieServlet");//访问站点下的某个资源
cookie.setPath("/");//访问服务器下的所有请求都会携带
// 4.发送给客户端
response.addCookie(cookie);
5.删除cookie 实际上就是覆盖 将时间设置为0
Cookie cookie2 = new Cookie("name", "wsw");
cookie2.setMaxAge(0);
cookie2.setPath("/web_cookie/CookieServlet");
response.addCookie(cookie2);
三:记录上次访问时间
//解决响应给客户端的中文乱码
response.setContentType("text/html;charset=UTF-8");
//创建当前访问时间
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
// 写入上次登录的时间
Cookie cookie = new Cookie("lastTime", format);
cookie.setMaxAge(60 * 3);// 单位秒
response.addCookie(cookie);
String lastTime = null;
//目的为了获取获取lastTime的cookie值
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie2 : cookies) {
if ("lastTime".equals(cookie2.getName())) {
lastTime = cookie2.getValue();
}
}
}
if (lastTime == null) {
response.getWriter().write("欢迎第一次访问");
} else {
response.getWriter().write("您上次的访问时间是" + lastTime);
}
四:实现免登录
1.前台创建一个jsp登录页面
<%@ 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>登录</title>
<%
String username = null;
String password = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
} else if ("password".equals(cookie.getName())) {
password = cookie.getValue();
}
}
}
if (username != null && password != null) {
request.getRequestDispatcher("/noPasswordCookieServlet?username=" + username+ "&password=" + password).forward(request,response);
}
%>
</head>
<body>
<form action="/web_cookie/noPasswordCookieServlet" method="post">
用户名:<input type="text" name="username" /><br />
密码:<input type="password" name="password" /><br />
<select name="rememberday">
<option value="0">不记住密码</option>
<option value="7">7天</option>
<option value="30">30天</option>
</select><br />
<input type="submit" />
</form>
<%
if (request.getAttribute("error") != null) {
%>
<%=request.getAttribute("error")%>
<%
}
%>
</body>
</html>
2.Servlet代码块
// 实现免登录
// post请求乱码解决
request.setCharacterEncoding("utf-8");
// 获得请求的参数
String username = request.getParameter("username");
String password = request.getParameter("password");
// 验证是否登录成功,账户与密码写死了,没走数据库
if ("wym".equals(username) && "123".equals(password)) {
// 是否需要免登录
String rememberday = request.getParameter("rememberday");
// 如果时免登录过来的,没有remember长度
if (rememberday != null) {
// 免登录的天数
int day = Integer.parseInt(rememberday);
if (day != 0) {
// 将创建的cookie的对象发送给客户端
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password);
cookie1.setMaxAge(60 * 60 * 24 * day);
cookie2.setMaxAge(60 * 60 * 24 * day);
response.addCookie(cookie1);
response.addCookie(cookie2);
}
}
response.sendRedirect("/web_cookie/success.html");
} else {
request.setAttribute("error", "用户名或者密码错误");
// 请求转发
request.getRequestDispatcher("/login.jsp").forward(request,
response);
}
五:记住密码
1.前台创建一个jsp登录页面
<%@ 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>
<%
String username = null;
String password = null;
Cookie[] cookies = request.getCookies();
if(cookies!=null){
for (Cookie cookie : cookies) {
if ("username".equals(cookie.getName())) {
username = cookie.getValue();
} else if ("password".equals(cookie.getName())) {
password = cookie.getValue();
}
}
}
%>
</head>
<body>
<form action="/web_cookie/rememberPasswordCookie" method="post">
用户<input type="text" name="username" <%if (username != null) {%> value=<%=username%> <%}%> /><br>
密码<input type="password" name="password" <%if (password != null) {%> value=<%=password%> <%}%> /> <br>
记住密码<input type="checkbox" name="checkbox" <%if(username !=null){ %> checked<%} %> value="ok" />
<input type="submit" />
</form>
<%
if (request.getAttribute("error") != null) {
%>
<%=request.getAttribute("error")%>
<%
}
%>
</body>
</html>
2.Servlet代码块
// 获得请求的参数
String username = request.getParameter("username");
String password = request.getParameter("password");
//账户与密码写死了,没走数据库
if ("wsw".equals(username) && "123".equals(password)) {
String flag = request.getParameter("checkbox");
if ("ok".equals(flag)) {
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password);
cookie1.setMaxAge(60 * 60 * 24 * 7);
cookie2.setMaxAge(60 * 60 * 24 * 7);
response.addCookie(cookie1);
response.addCookie(cookie2);
} else {
Cookie cookie1 = new Cookie("username", username);
Cookie cookie2 = new Cookie("password", password);
cookie1.setMaxAge(0);
cookie2.setMaxAge(0);
response.addCookie(cookie1);
response.addCookie(cookie2);
}
response.sendRedirect("/web_cookie/success.html");
} else {
request.setAttribute("error", "用户名或密码错误");
request.getRequestDispatcher("/login02.jsp").forward(request,
response);
}
六:Cookie 和 浏览器的缓存的区别
共同点: 都是在本地
不同点:缓存可以放任意数据 cookie 只是服务器发送给客户端的某些数据 (cookie是缓存的一部分)