需求
- 从页面输入的用户名和密码,和数据库中的用户信息进行比对,全部相同才可以登录成功
- 有一个信息不同则显示"错误,重新登录"
- 登录成功后才可以访问其他页面,比如列表页,新增页等
- 直接在浏览器中访问其他页面也要跳转到登录页进行登录后再操作
数据表User
实现简单的登录页面,那就设计一个简单的用户信息表,字段简约,这是mysql建表和一条admin用户的数据
bash
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES (1, 'admin', '666');
前端页面
同样简约的前端页面(没有添加任何样式)

html
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>登录</title>
</head>
<body>
<!-- 这里用来放需要登录或是输入错误的提示词 -->
<h3 name="top">${top}</h3>
<form method="POST" action="/login">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="提交"/></td>
</tr>
</table>
</form>
</body>
</html>
输入信息错误,显示页面:

Filter
java
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
//这里存放需要过滤的页面(我放的是列表和新增页的)
@WebFilter(urlPatterns = {"/info","/input"})
//通过实现Filter接口来进行页面的过滤操作
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
//获取session中的数据,有user数据就可以操作,没有要进行登录
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
User user = (User) request.getSession().getAttribute("user");
//为空表示没有登录,设置提示词,跳转到登录页面
if (user == null) {
request.setAttribute("top","需要登录!!!");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void destroy() {
}
}
登录判断
User实体类
java
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String username;
private String password;
}
servlet层
java
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 java.io.IOException;
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private UserService userService = new UserServiceImpl();
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
User user = new User();
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
String username = req.getParameter("username");
if(username != null && !username.isEmpty()){
user.setUsername(username);
}
String password = req.getParameter("password");
if(password != null && !password.isEmpty()){
user.setPassword(password);
}
User u = userService.getByNameAndPass(user);
if(u == null){
req.setAttribute("top","用户名或密码错误,请重新输入");
req.getRequestDispatcher("/login.jsp").forward(req,resp);
}else {
req.getSession().setAttribute("user",u);
req.getRequestDispatcher("/info").forward(req,resp);
}
}
}
service层
java
//接口
public interface UserService {
User getByNameAndPass(User user);
}
java
//实现类
public class UserServiceImpl implements UserService {
private UserDAO userDAO = new UserDAOImpl();
@Override
public User getByNameAndPass(User user) {
return userDAO.getByNameAndPass(user);
}
}
dao层
java
//接口
public interface UserDAO {
User getByNameAndPass(User user);
}
java
//实现类
public class UserDAOImpl implements UserDAO {
private SqlSession sqlSession = ConnUtils.getSqlSession();
@Override
public User getByNameAndPass(User user) {
return sqlSession.selectOne("cn.stu.mapper.UserMapper.getByNameAndPass", user);
}
}
mapper层
xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.stud.mapper.UserMapper">
<select id="getByNameAndPass" resultType="cn.stud.domain.User">
select id, username,password
from user
<where>
<if test="username != null and username != ''">
username = #{username}
</if>
<if test="password != null and password != ''">
and password = #{password}
</if>
</where>
</select>
</mapper>
记得要把新增的用户mapper,添加到mybatis和log4j文件当中,因为我这边原来做的是学生信息管理,User相关的操作和页面都是新添加进去的,所以要重新配置文件哦