目录
三、有关Cookie和Session的Servlet的API
是http请求中,header的一个属性。Cookie是存储在客户端的小型文本文件,由服务器发送给客户端,客户端会将其存储在本地。它可以用于存储用户的身份标识(sessionID),每次客户端向服务器发送请求时,会自动携带相应的Cookie信息,服务器就会根据Cookile中的sessionID,寻找对应的session对象,sessionID和session对象是一组键值对,在session对象中存储的是客户端的基本信息,由程序员自定义,以键值对形式存在。若客户端第一次访问该浏览器时,还没有Cookie信息,服务器收到请求后会为客户端建立一个session对象,在响应信息中,服务器会返回给客户端。
Session则是在服务器端存储用户信息的一种机制。当用户第一次访问浏览器时,服务器会为其创建一个唯一的会话ID,并将相关信息存储在服务器端。客户端会收到这个会话ID,并在后续的请求中将其发送给服务器。服务器通过这个会话ID可以获取用户的信息,实现状态管理和用户识别。Session是保存在内存中的,重启服务器时,Session信息就丢失了。
1、获取请求中的Cookie或Session
2、增加响应中的Cookie,返回给客户端
3、对session对象内容的操作
实现一个登陆页面,通过用户名和密码登陆,登陆成功欢迎用户。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.container {
width: 600px;
margin: 20px auto;
}
h1 {
text-align: center;
}
.row {
display: flex;
height: 40px;
justify-content: center;
align-items: center;
}
.row span{
width: 80px;
}
.row input{
width: 200px;
height: 30px;
}
</style>
</head>
<body>
<form action="login" method="post">
<div class="container">
<h1>登陆系统</h1>
<div class="row">
<span>用户名</span>
<input type="text" name="username">
</div>
<div class="row">
<span>密码</span>
<input type="text" name="password">
</div>
<div class="row">
<span></span>
<input type="submit" value="登陆">
</div>
</div>
</form>
</body>
</html>
页面:
(1)建表
create database if not exists logins_list charset utf8;
use logins_list;
drop table if exists lists;
-- 删表目的是为了, 防止之前数据库里有一样的表, 对咱们的代码产生干扰.
create table lists(username varchar(1024),password varchar(1024));
(2)获得数据源
private DataSource dataSource=new MysqlDataSource();
@Override
public void init() throws ServletException {
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/message_wall?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("272222");
}
(3)处理请求
①登陆服务器
根据请求中的username去数据库中查找password,与请求中的password做对比,出现为空或错误则登陆失败,登陆成功时,为用户建立session对象,在session对象中添加username和登陆时间。
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@WebServlet("/login")
public class loginServlet extends HttpServlet{
private DataSource dataSource=new MysqlDataSource();
@Override
public void init() throws ServletException {
((MysqlDataSource) dataSource).setUrl("jdbc:mysql://127.0.0.1:3306/logins_list?characterEncoding=utf8&useSSL=false");
((MysqlDataSource) dataSource).setUser("root");
((MysqlDataSource) dataSource).setPassword("272222");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf8");
String username=req.getParameter("username");
String password=req.getParameter("password");
//根据用户名查找密码
//结果为空,用户未注册;密码不正确;
try {
String password1=select(username);
if(password1==null||!password1.equals(password)){
//登陆失败
resp.setContentType("text/html;charset=utf8");
resp.getWriter().write("用户未注册或密码错误");
return;
}
//登陆成功
HttpSession session=req.getSession(true);
//获取session对象 没有建立一个;
//先session对象里添加内容:用户名和登陆时间 其他servlet也可以使用
session.setAttribute("username",username);
session.setAttribute("logintime",System.currentTimeMillis());
//跳转到登陆成功页面
//跳转时会把cookie信息带上
resp.sendRedirect("index");
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
public String select(String username) throws SQLException {
Connection connection=dataSource.getConnection();
String sql="select password from lists where username=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,username);
ResultSet resultSet=statement.executeQuery();
String password=null;
while (resultSet.next()){
password=resultSet.getString("password");
}
return password;
}
}
②登陆结果服务器
登陆成功后,跳转到登陆成功页面。若session为空,在登陆页面并未登陆;若不为空,取出session对象的用户名和时间,添加到响应正文中。
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.text.SimpleDateFormat;
@WebServlet("/index")
public class indexServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session=req.getSession(false); //没有代表未登陆 不生成新的会话
resp.setContentType("text/html;charset=utf8");
if(session==null){
//未登录
resp.getWriter().write("您当前未登录!!!");
return;
}
String username=(String) session.getAttribute("username"); //object类型 强转
Long logintime=(Long) session.getAttribute("logintime");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String time=simpleDateFormat.format(logintime);
resp.getWriter().write("欢迎你"+username+"!!!"+"\r\n");
resp.getWriter().write("你上次登录时间为:"+time);
}
}
?
登陆请求(POST)
登陆跳转(GET)