用户登录练习会话跟踪

3 阅读7分钟

需求说明

  1. 用户登录界面,功能完善
  2. 输入正确的用户名和密码,跳转到成功界面,否则留在原地并提示用户名或密码错误
  3. 如果勾选“记住用户”,则下次访问登录页面自动填充用户名密码

开发流程

浏览器请求->Web层->Service层->Dao层->服务器

浏览器<-Web层<-Service层<-Dao层<-服务器数据

web层

  • 接受用户名和密码
  • 调用userservlet查询用户
  • 判断用户名是否存在

Service层

  • 调用UserDao调查用户

    user login(String userName,String pwd)

  • Dao层

    user selectUser(String userName,String pwd)

思路

  1. 前端通过表单发送请求和数据给Web层的LoginServlet

使用${cookie.userName.value}获取cookie中的用户名

使用${cookie.pwd.value}获取cookie中的密码

  1. 在LoginServlet中接受请求和数据[用户名和密码]
  2. LoginServlet接收到请求和数据,调用Service层根据用户名和密码查询用户对象
  3. 在Service层调用UserDao,根据用户名和密码查询用户
  4. 在UserDao根据用户名和密码查询用户,把数据查询出来,将返回数据封装到User对象,将对象交给Service层
  5. Service层将数据返回给Web层
  6. Web层获取到User对象后,判断User对象,如果为Null,则返回错误信息,如果不为Null

(1)将用户信息存储到Session和Cookie中

(2)进入成功页面

代码

1目录结构

image.png

小提示:

  • 在Eclipse左上角File-New-Dynamic Application project新建一个Maven工程
  • 在Maven工程的Java Resources中的src/main/java中右键New-Class,并且在Package中写好路径和名字,用这种方法来创建UserDao.java、User.java、UserService.java、DruidUtils.java。Servlet文件夹需要右键New-Servlet方式创建。
  • 依赖包需要放到项目-src-main-webapp-WEB-INF-lib下
  • 请提前配置好jdk、Servlet、Tomcat、MySql并确定好版本
  • 如果你的Maven项目没有自动生成resources文件夹那么自己建一个然后在电脑桌面上新建一个文本文件,然后写入一些东西(我下面会给)然后改名成druid.properties然后再把这个文件放入resources。然后再右键点击resources-Build Path-Use as Scource Folder这时在Maven项目的Java Resources下面就会有这个文件夹了,这表示着java认识这个文件夹了。

login.jsp代码

<%@ page language="java" contentType="text/html; charset=UTF-8"

pageEncoding="UTF-8"%>

<!DOCTYPE html>

<html>

<head>

<meta charset="UTF-8">

<title>登录</title>

</head>

<body>

<div align="center">

<form action="${pageContext.request.contextPath}/login" method="post">

用户名:<input type="text" name="userName" placeholder="请输入用户名"]><br>

密码:<input type="password" name="pwd" ><br>

<label>

<input type="checkbox" name="remember" value="1">记住我的登录信息

<a href="register.jsp">没有账号?</a>

</label>

<br>

<input type="submit" value="登录">

</form>

</div>

</body>

</html>

简单的前端页面,在webapp文件右键New-JSP File创建。主要好UTF-8。

${pageContext.request.contextPath}表示这个文件的路径。

method="post"表示发送方式。

必须留意input标签中的 name属性,这关乎后面的数据传递。

User.java代码

package login.com.user.model;

public class User{

//用户编号

private Long id;

//用户名

private String userName;

//密码

private String pwd;

public User() {

}

public User(String userName,String pwd) {

super();

this.userName=userName;

this.pwd=pwd;

}

  


public String getUserName() {

return userName;

}

public void setUserName(String userName) {

this.userName = userName;

}

public String getPwd() {

return pwd;

}

public void setPwd(String pwd) {

this.pwd = pwd;

}

@Override

public String toString() {

return "User [id=" + id + ", userName=" + userName + ", pwd=" + pwd + "]";

}

}

注意与Mysql数据库中的表的字段对角,不要弄错了字段名与变量名。

这个java文件的作用是为了与Mysql数据库的字段名对接。对接是为了把网页上输入的数据和从数据库中的数据对比。

druid.properties代码

driverClassName=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/userdb?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true

username=root

password=123456

initialSize=5

maxActive=10

maxWait=3000

注意这就是我上面说的那个在电脑桌面创建的文本文件中写入的东西,它的作用是写入Mysql的信息,url、用户名、密码、最大连接数等等。你从java连入Mysql得有身份和密码吧,不然你的数据库四敞大开的,写好后改名为druid.properties(就是改扩展名啊别后面再跟个.txt了)。然后把这个文件放到resources。然后再右键点击resources-Build Path-Use as Scource Folder这时在Maven项目的Java Resources下面就会有这个文件夹了,这表示着java认识这个文件夹了。

DuridUtils.java代码

package login.com.user.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

public class DruidUtils {

    private static DataSource dataSource;

    static {
        try {
            Properties pro = new Properties();
            pro.load(DruidUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            dataSource = DruidDataSourceFactory.createDataSource(pro);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    // 获取连接池
    public static DataSource getDatasource() {
        return dataSource;
    }

    // 获取连接
    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }
}

这个文件是为了连接数据库,e....

UserDao.java代码

package login.com.user.dao;

  


import java.sql.SQLException;

  


import org.apache.commons.dbutils.QueryRunner;

import org.apache.commons.dbutils.handlers.BeanHandler;

  


import login.com.user.model.User;

import login.com.user.utils.DruidUtils;

  


public class UserDao {

//根据数据源创建QueryRunner

QueryRunner qr=new QueryRunner(DruidUtils.getDatasource());

//根据用户名和密码查询用户

public User selectUser(String userName, String pwd) throws SQLException {

//System.out.println(userName+pwd);//检查参数是否传递成功

String sql="select id,user_name as userName,pwd from u where user_name=? and pwd=?;";

User myUser=qr.query(sql,new BeanHandler<>(User.class),userName,pwd);

//System.out.println(myUser+"UserDao返回值");

return myUser;

}

//增加用户

public void addUser(User user) throws SQLException {

String sql="insert into u(user_name,pwd) values(?,?);";

qr.update(sql,user.getUserName(),user.getPwd());

}

}

这个文件的作用是从java里写一个sql语句然后在Mysql里把数据搞来。然后再根据User.java创建一个变量把数据存着。

UserService.java代码

package login.com.user.service;

  


import java.sql.SQLException;

import login.com.user.dao.UserDao;

import login.com.user.model.User;

  


public class UserService {

  


public UserDao userDao=new UserDao();

//根据登录名和密码登录

public User login(String userName,String pwd) {

User user=null;

//System.out.println(userName+pwd);//检查参数是否传递成功

try {

user =userDao.selectUser(userName,pwd);

}catch(SQLException e) {

e.printStackTrace();

}

return user;

}

//注册用户

public void register(User user) {

try {

userDao.addUser(user);

}catch(SQLException e){

e.printStackTrace();

}

}

}

这个文件是把LoginServlet.java的数据转手给UserDao.java。工作流程就是前端login.jsp把用户名和密码传到LoginServlet.java,然后LoginServlet.java再把数据传到这个UserService.java文件,然后UserService.java再把数据传给UserDao.java文件,然后UserDao.java跟Mysql沟通,然后再传回来。

LoginServlet.java代码

package login.com.user.servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import login.com.user.model.User;
import login.com.user.service.UserService;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
	

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 获取用户名
		String userName=request.getParameter("userName");
		//System.out.println(userName);//控制台中检查是否成功传递参数
		//获取密码
		String pwd =request.getParameter("pwd");
		//System.out.println(pwd);//控制台中检查是否成功传递参数
		//获取记住我复选框
		String remember=request.getParameter("remember");
		//创建业务对象
		UserService userService=new UserService();
		//根据用户名和密码查询用户
		User myUser = userService.login(userName,pwd);
		//System.out.println(myUser);
		//如果用户不存在
		if(myUser == null) {
			//保存错误提示到request中
			request.setAttribute("errMsg", "用户名或密码错误");
			//跳转到login.jsp页面重新登录
			request.getRequestDispatcher("/login.jsp").forward(request, response);
		}else {
			//登录成功
			//保存用户信息到session
			request.getSession().setAttribute("loginer", myUser);
			//判断是否勾选记住我
			if(remember !=null&&remember.equals("1")) {
				//创建用户名称Cookie
				Cookie nameCookie=new Cookie("userName",myUser.getUserName());
				//创建密码Cookie
				Cookie pwdCookie=new Cookie("pwd",myUser.getPwd());
				//设置Cookie的存活时间为一周
				nameCookie.setMaxAge(60*60*24*7);
				pwdCookie.setMaxAge(60*60*24*7);
				//发送
				response.addCookie(nameCookie);
				response.addCookie(pwdCookie);
			}
			request.getRequestDispatcher("/welcome.jsp").forward(request, response);

		}
	}


}

这个文件的代码是用来接受前端传过来的用户名和密码,你是不是要问为什么不直接传到UserDao.java还要这么费劲干嘛?抱歉,Serlvet文件能够对接前端,而其他的文件都是java文件用来定义变量以及与Mysql沟通,每个文件的作用都不一样。

Pom.xml代码

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

  


<groupId>login.com.user</groupId>

<artifactId>login</artifactId>

<version>1.0-SNAPSHOT</version>

<packaging>war</packaging>

  


<name>login</name>

  


<!-- 统一属性配置,方便后续修改 -->

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<maven.compiler.source>1.8</maven.compiler.source>

<maven.compiler.target>1.8</maven.compiler.target>

<servlet.version>4.0.1</servlet.version>

<mysql.version>8.0.33</mysql.version>

<druid.version>1.2.16</druid.version>

<dbutils.version>1.7</dbutils.version>

<junit.version>4.13.2</junit.version>

</properties>

  


<dependencies>

<!-- 1. Servlet API (Tomcat自带,provided scope避免打包冲突) -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>${servlet.version}</version>

<scope>provided</scope>

</dependency>

  


<!-- 2. MySQL 驱动(连接MySQL必须) -->

<dependency>

<groupId>com.mysql</groupId>

<artifactId>mysql-connector-j</artifactId>

<version>${mysql.version}</version>

</dependency>

  


<!-- 3. Druid 数据库连接池(你用的DruidUtils核心依赖) -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>${druid.version}</version>

</dependency>

  


<!-- 4. Apache Commons DBUtils(简化JDBC,你用的QueryRunner核心依赖) -->

<dependency>

<groupId>commons-dbutils</groupId>

<artifactId>commons-dbutils</artifactId>

<version>${dbutils.version}</version>

</dependency>

  


<!-- 5. JUnit 单元测试(可选,写测试用例用) -->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>

</dependencies>

  


<!-- Maven 打包插件,确保打包成标准war包 -->

<build>

<finalName>login</finalName>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-war-plugin</artifactId>

<version>3.3.2</version>

<configuration>

<failOnMissingWebXml>false</failOnMissingWebXml>

</configuration>

</plugin>

</plugins>

</build>

</project>

这个文件的作用相当于一个菜单,告诉java大致情况。在Maven项目-src右键New-Other,然后在Wizards:下输入xml,然后再Web Services下面选择Web Service就能创建了。

welcome.jap代码

<%@ 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>恭喜你登录成功</h1>

</body>

</html>

大道至简这一块。

MYSQL

对接一下Mysql的用户名密码之类的,别搞错了,然后创建一个数据库和表,自己编一些数据。

先使用数据库

use userdb;

然后创建表

    create table u(
        id int,
        user_name varchar(60),
        pwd varchar(60)
    );

(依旧大道至简)

插入数据

insert into u values(0,'aaa','123456'),(1,'bbb','111111'),(2,'ccc','222222');

查询数据

select * from u;

注意

  • 注意SQL指令必须以;结尾,UserDao.java中也一样,不要忘了。
  • Dao、model、service、utils中的文件是java文件而servlet中的文件是servlet文件。
  • 前端注意input标签的name属性名,这个很重要,要往后面传递数据。servlet中接受的就是这个,要注意两者要相同。后面各个文件之间的参数传递也要注意同类型问题。
  • 这篇文章偏实战,轻知识点讲解。