1.会话技术
2.Cookie
3.Session
一、会话技术
1.会话技术简介
会话:用户打开浏览器,浏览页面,直到关闭浏览器的过程称为一次会话。
为什么要学习会话技术?
http协议是一个无状态协议,服务器端无法记录客户端浏览器身份信息。
例如:购物网站,购物车(需要记录用户购买商品的信息)。
如何做到? request? 无法实现,会发现结账时,没有任何商品信息。
ServletContext? 无法实现,结账时会发现,所有人的商品信息都在购物车中。
因此,需要使用会话跟踪技术解决。
会话跟踪技术包括: Cookie(客户端技术)、Session(服务器端技术)
二、Cookie
1.Cookie简介
生活中常见的使用Cookie的案例:QQ记住密码、网站智能账号密码填充、百度搜索记录
作用:将数据存储到本地为了智能填充数据,还能够增强用户体验,缓解服务器压力。
(1)Cookie在哪
删除所有的本地Cookie 方法:Ctrl + shift + Delete
(2)如何给自己的网站缓存数据
response 是可以将信息返回到浏览器上,所以设置Cookie 的时候是借助Response对象将Cookie发送到本地浏览器。
获取Cookie的方法时通过reqeust 进行获取
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo1Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建Cookie----参数name和value都是String,而且不能用非西文
Cookie cookie = new Cookie("company","QQCY");
//2.通过response将Cookie传给客户端
response.addCookie(cookie);
}
}
注:如果再创建一个Cookie,name一样,那么会覆盖原来的值。
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo2Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取客户端带来的Cookie
//request.getCookies()获取所有Cookie
//不支持按个获取,request方法会直接将所有的cookie全部取到并返回一个数组
Cookie[] cs = request.getCookies();
for(Cookie c:cs){
//Cookie没哟提供根据name获取value的方法,提供了两个方法
System.out.println(c.getName()+":"+c.getValue());
}
}
}
2.Cookie的常用方法
构造方法: Cookie c = new Cookie("",""); 创建Cookie时, name和value都是字符串。注意:不能用中文字符串。
getName() 获得Cookie的name
getValue() 获得Cookie的value 注意:Cookie没有提供根据name获取value的方法
setMaxAge(int 秒) 设置Cookie的存活时间
setPath() 设置Cookie的有效路径
浏览器将cookie保存硬盘的路径,是各个浏览器自己制定,其他无法进行操作的。
有效路径:浏览器发送请求时,cookie的代入路径。
请求路径 等于或者包含cookie的有效路径,该cookie会在请求时被代入。
请求路径是从资源位置开始进行判断
方法名 |
描述 |
setPath(java.lang.String uri) |
设置有效路径。 设置cookie允许被访问的路径。设置的路径,以及子路径都被允许访问。 例如:setPath("/web/a/b"); http://localhost:8080/web/a/b/oneServlet,可访问(当前路径) http://localhost:8080/web/a/b/c/oneServlet,可访问(子路径) http://localhost:8080/web/a/c/oneServlet,不允许访问(无关路径) 常见设置:setPath("/") ,当前tomcat下的所有的web项目都可以访问 cookie.setPath("/"); |
3.封装查找Cookie的工具类
package com.xj.utils;
import javax.servlet.http.Cookie;
public class CookieUtils {
public static Cookie findCookieByName(Cookie[] cs,String name){
if(cs!=null){
for(Cookie c:cs){
if(name.equals(c.getName())){
return c;
}
}
}
return null;
}
}
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xj.utils.CookieUtils;
public class CookieDemo2Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "company");
if(c!=null){
System.out.println(c.getName()+":"+c.getValue());
}
}
}
4.设置Cookie的存活时间
上面的代码创建的Cookie,如果关闭浏览器,再访问CookieDemo2Servlet,控制台不会获取到Cookie,说明上面创建的Cookie是瞬时的。下面的代码设置Cookie的存活时间,即使关闭了浏览器,再访问CookieDemo2Servlet时,还是会获取到。
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CookieDemo1Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie
Cookie c = new Cookie("address","CHINA");
//设置存活时间,设置完成后,这个Cookie就编程持久化Cookie,保存在浏览器管理的一个磁盘文件中(保存时间为设置的时间)
c.setMaxAge(7*24*60*60);//设置7天
//把Cookie响应给客户端
response.addCookie(c);
}
}
5.案例
(1) 利用Cookie记录客户端是否是第一次访问
需求:创建一个FirstCookieServlet 客户端访问这个Servlet
如果是第一次访问这个Servlet 显示 欢迎第一次访问
如果不是第一次访问这个Servlet 显示 欢迎回来
package com.xj.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xj.utils.CookieUtils;
public class FirstCookieServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "visited");
if(c==null){
out.print("<h1>欢迎第一次访问</h1");
Cookie cookie = new Cookie("visited","true");
cookie.setMaxAge(10000);
response.addCookie(cookie);
}else{
out.print("<h1>欢迎回来</h1");
}
}
}
(2)利用Cookie记录客户端上次访问时间
1.接收客户端带过来Cookie的信息
2.从数组中查找指定名称Cookie,如果找不到(第一次访问),输出一个欢迎 ,如果找到了(不是第一次),取出上次的访问时间,显示到页面
3.记录系统当前时间
4.利用Cookie回写当前时间
package com.xj.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xj.utils.CookieUtils;
public class SecondCookieServlet extends HttpServlet {
private static final String SimpleFormate = null;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "lastVisitedTime");
if(c==null){
out.print("<h1>欢迎第一次访问</h1>");
}else{
String value = c.getValue();
out.print("<h1>"+value+"</h1>");
}
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd#HH:mm:ss");
String str = sdf.format(date);
Cookie cookie = new Cookie("lastVisitedTime",str);
cookie.setMaxAge(100000);
response.addCookie(cookie);
}
}
(3)记录用户名
1、数据库
2、导包
3、工具类和配置文件(配置文件里面要改成新建的数据库)
4、页面
<%@page import="com.xj.utils.CookieUtils"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>
</head>
<%
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs,"username");
String username="";
if(c!=null){
username = c.getValue();
}
%>
<div style="color:red">
<c:if test="${param.msg=='loginerror' }">
用户名或密码错误
</c:if>
</div>
<body>
<form action="${pageContext.request.contextPath }/LoginServlet">
用户名:<input type="text" name="username" value="<%=username %>"/><br>
密码:<input type="password" name="password" /><br>
记录用户名:<select name="record">
<option value="0">记录0天</option>
<option value="7">记录七天</option>
<option value="30">记录30天</option>
</select><br>
<input type="submit" value="登录" />
</form>
</body>
</html>
<%@ 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>
</head>
<body>
<h1>主页,欢迎 </h1>
</body>
</html>
5、实体类
package com.xj.bean;
public class User {
private int id;
private String name;
private String username;
public User(){}
public User(int id, String name, String username) {
super();
this.id = id;
this.name = name;
this.username = username;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
}
6、dao
package com.xj.dao;
import com.xj.bean.User;
public interface UserDao {
public User login(String username,String password);
}
package com.xj.dao.impl;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import com.xj.bean.User;
import com.xj.dao.UserDao;
import com.xj.utils.C3p0Utils;
public class UserDaoImpl implements UserDao{
@Override
public User login(String username, String password) {
User user = null;
QueryRunner qr = new QueryRunner(C3p0Utils.getDataSource());
String sql = "select * from user where username=? and password=?";
try {
user = qr.query(sql, new BeanHandler<>(User.class),username,password);
} catch (SQLException e) {
e.printStackTrace();
}
return user;
}
}
7、Servlet
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xj.bean.User;
import com.xj.dao.UserDao;
import com.xj.dao.impl.UserDaoImpl;
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String record = request.getParameter("record");
UserDao dao = new UserDaoImpl();
User user = dao.login(username, password);
if(user!=null){
int num = Integer.parseInt(record);
if(num!=0){
Cookie c = new Cookie("username",username);
c.setMaxAge(num*24*60*60);
response.addCookie(c);
}
response.sendRedirect("index.jsp");
}else{
response.sendRedirect("login.jsp?msg=loginerror");
}
}
}
8、结果
(4)记录浏览记录并且清除浏览记录
工具类参考前面
1、main.jsp
<%@page import="com.xj.utils.CookieUtils"%>
<%@ 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>
</head>
<body>
<table>
<tr>
<td><img src="img/1.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=1">萝卜</a></div></td>
<td><img src="img/2.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=2">冬瓜</a></div></td>
<td><img src="img/3.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=3">西红柿</a></div></td>
</tr>
<tr>
<td><img src="img/4.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=4">芹菜</a></div></td>
<td><img src="img/5.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=5">土豆</a></div></td>
<td><img src="img/6.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=6">胡萝卜</a></div></td>
</tr>
</table>
<hr>
<div>
浏览记录:<a href="ClearServlet">清除浏览记录</a>
</div>
<%
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "ids");
if(c!=null){
String value = c.getValue();
String[] ss = value.split(",");
for(String s:ss){
%>
<img src="img/<%=s %>.jpg" width="150px" height="100px">
<%
}
}
%>
</body>
</html>
2、view.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>
</head>
<body>
<img src="img/${requestScope.id }.jpg" width="400px" height="400px" />
<div>产地...</div>
<div>价格...</div>
<div>数量...</div>
<div><a href="main.jsp">返回</a></div>
</body>
</html>
3、FindGoodsServlet
package com.xj.servlet;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.mysql.fabric.xmlrpc.base.Array;
import com.xj.utils.CookieUtils;
public class FindGoodsServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String id = request.getParameter("id");
//如果是真实的项目,应该根据id到数据库中查询书数据,跳转到展示页面
//这里就不真实查询数据库了,就用id值充当商品
//记录浏览过哪些商品,使用Cookie
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "ids");
if(c==null){//说明是第一次浏览商品
Cookie cookie = new Cookie("ids",id);
cookie.setMaxAge(10000);
response.addCookie(cookie);
}else{//浏览过商品
//判断是否浏览过本商品
String value = c.getValue();
String[] ss = value.split(",");
List<String> list = Arrays.asList(ss);
if(!list.contains(id)){
value=value+","+id;
Cookie cookie = new Cookie("ids",value);
cookie.setMaxAge(10000);
response.addCookie(cookie);
}
}
request.setAttribute("id", id);
request.getRequestDispatcher("view.jsp").forward(request, response);
}
}
4、ClearServlet
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xj.utils.CookieUtils;
public class ClearServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/*//第一种解决方案 覆盖
Cookie c = new Cookie("ids","");
response.addCookie(c);*/
//第二种解决方式
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "ids");
c.setMaxAge(0);
response.addCookie(c);
response.sendRedirect("main.jsp");
}
}
5、结果
三、Session
1.简介
服务端会话技术
Servlet规范下的一个组件,全称HttpSession,同时也是一个作用域。
生活中实例:登录网站,关闭浏览器之后会提示你重新登录。
如何做到关闭浏览器后通知你重新登录。
Session作用域的特性:存放的值可以跨页面,只要你不关闭浏览器那么你的作用域的值就一直存在。也就意味着会话不结束session长存(可以设置最大存活时间)。
实际项目中如何实现访问页面拦截:在登录成功之后,将用户的ID或者对象存到Session中,如果访问页面的时候判断Session中存在这个ID 意味着现在已经登录可以访问本页面,如果ID获取不到,意味着没有登录。
2.获取Session
方式一: HttpSession session = request.getSession()
如果session还没有创建,则创建。
如果已经创建,则使用已经创建的session。
方式二: HttpSession session = request.getSession(false);
如果session已经创建过,则使用已经创建的session。
如果session没有创建过,则返回null。
Session的getId() 方法可以获得Session的id
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo1Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.获取HttpSession对象 getSession()
HttpSession session = request.getSession();
System.out.println(session.getId());
}
}
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo2Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println(session.getId());
}
}
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo3Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(false);
System.out.println(session.getId());
}
}
3、Session常用方法
session.setAttribute("",Object);
session.getAttribute("");
session.removeAttribute("");
可以作为作用域
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo4Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setAttribute("reqkey", "reqvalue###");
request.getSession().setAttribute("sessionkey", "sessionvalue");
this.getServletContext().setAttribute("sckey", "scvalue<<>>");
response.sendRedirect("SessionDemo5Servlet");
}
}
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class SessionDemo5Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String reqvalue = (String)request.getAttribute("reqkey");
String sessionvalue = (String)request.getAttribute("sessionkey");
String scvalue = (String)this.getServletContext().getAttribute("sckey");
System.out.println("request:"+reqvalue);
System.out.println("session:"+sessionvalue);
System.out.println("sc:"+scvalue);
}
}
4.Session的原理
当创建完session后,服务器会做一个Cookie(瞬时Cookie),把session的id值带给用户
5.Session的创建和销毁
(1) Session的创建
在某个会话下,第一次调用getSession()为本次会话创建Session
(2) Session的销毁
注:浏览器关闭Session对象并没有销毁(指向Session的保存着Session的id的Cookie就不存在了,也就再也不能访问到之前的Session对象了。Session对象变成了垃圾) 只不过是存放这个Session的id的Cookie销毁了,导致Session对象获得不到了。
1、关闭服务器(非正常关闭服务器)
(如果是正常关闭服务器,Session将被序列化到服务器中)tomcat\work\Catalina\localhost\1202Session\SESSION.ser
2、session时间到期 session的默认存活时间是30分钟
默认配置在tomcat的web.xml中
<session-config>
<session-timeout>30</session-timeout>
</session-config>
可以在自己的web.xml配置Session的过去时间,配置方式和tomcat的web.xml中配置方式相同。
3、调用session 的 invalidate()方法
还能够获得到session的id值,但session的其他方法就不能调用了
5.案例:session中保存登录信息
在cookie的后两个案例基础上进行修改
1、LoginServlet
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.xj.bean.User;
import com.xj.dao.UserDao;
import com.xj.dao.impl.UserDaoImpl;
public class LoginServlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");
String password = request.getParameter("password");
String record = request.getParameter("record");
UserDao dao = new UserDaoImpl();
User user = dao.login(username, password);
if(user!=null){
HttpSession session = request.getSession();
session.setAttribute("user", user);
int num = Integer.parseInt(record);
if(num!=0){
Cookie c = new Cookie("username",username);
c.setMaxAge(num*24*60*60);
response.addCookie(c);
}
response.sendRedirect("index.jsp");
}else{
response.sendRedirect("login.jsp?msg=loginerror");
}
}
}
2、index.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>
</head>
<body>
<h1>主页,欢迎 ,${sessionScope.user.username }</h1>
</body>
</html>
3、main.jsp
<%@page import="com.xj.utils.CookieUtils"%>
<%@page import="com.xj.bean.User"%>
<%@ 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>
</head>
<body>
<%
User user = (User)session.getAttribute("user");
if(user==null){
response.sendRedirect("login.jsp?msg=pleaselogin");
}
%>
<table>
<tr>
<td><img src="img/1.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=1">萝卜</a></div></td>
<td><img src="img/2.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=2">冬瓜</a></div></td>
<td><img src="img/3.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=3">西红柿</a></div></td>
</tr>
<tr>
<td><img src="img/4.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=4">芹菜</a></div></td>
<td><img src="img/5.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=5">土豆</a></div></td>
<td><img src="img/6.jpg" width="200px" height="200px" /><div><a href="FindGoodsServlet?id=6">胡萝卜</a></div></td>
</tr>
</table>
<hr>
<div>
浏览记录:<a href="ClearServlet">清除浏览记录</a>
</div>
<%
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs, "ids");
if(c!=null){
String value = c.getValue();
String[] ss = value.split(",");
for(String s:ss){
%>
<img src="img/<%=s %>.jpg" width="150px" height="100px">
<%
}
}
%>
</body>
</html>
4、login.jsp
<%@page import="com.xj.utils.CookieUtils"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!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>
</head>
<%
Cookie[] cs = request.getCookies();
Cookie c = CookieUtils.findCookieByName(cs,"username");
String username="";
if(c!=null){
username = c.getValue();
}
%>
<div style="color:red">
<c:if test="${param.msg=='loginerror' }">
用户名或密码错误
</c:if>
<c:if test="${param.msg=='pleaselogin' }">
请登录
</c:if>
</div>
<body>
<form action="${pageContext.request.contextPath }/LoginServlet">
用户名:<input type="text" name="username" value="<%=username %>"/><br>
密码:<input type="password" name="password" /><br>
记录用户名:<select name="record">
<option value="0">记录0天</option>
<option value="7">记录七天</option>
<option value="30">记录30天</option>
</select><br>
<input type="submit" value="登录" />
</form>
</body>
</html>
5、结果
6.禁用Cookie如果使用Session
禁用Cookie,使用上面的案例,访问main.jsp,提示登录,登录之后,再次访问main.jsp,商品页面没有显示出来,仍是登录页面。
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo6Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println(session.getId()+"----");
session.setAttribute("username", "青青草原");
//response.sendRedirect("SessionDemo7Servlet");两次获取的session不一样,且servlet6存的值servlet7取不到
response.sendRedirect("SessionDemo7Servlet;jsessionid="+session.getId());//两次获取的session一样,且servlet6存的值servlet7取得到
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo7Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
System.out.println(session.getId()+"<<<>>>");
System.out.println(session.getAttribute("username"));
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
7.关闭浏览器重新打开怎么获取原来的session
由前面可知,如果关闭浏览器再访问,会获得不一样的session值,下面代码可以做到关闭浏览器使得两次获得的session值一样。
因为上面禁止了,所以在这要设置允许。
package com.xj.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class SessionDemo8Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
Cookie c = new Cookie("JSESSIONID",session.getId());//注意要大写
c.setMaxAge(10000);
response.addCookie(c);
System.out.println(session.getId());
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
8.Cookie和Session的区别与联系
1、数据存储的位置不同 Cookie在客户端 Session在服务器端
2、生命周期不同 。Cookie(会话(瞬时)Cookie浏览器关闭 持久化Cookie setMaxAge(秒数))Session(默认30分钟,可以修改)
3、cookie只能存放字符串名值对(都是字符串),session可以是任意对象
4、同一个浏览器接受cookie的个数是有上限,session理论上是无限的。
联系:session的状态是靠cookie来保持的,session的id会通过cookie带给客户端