Java使用tomcat+servlet+filter实现简单的登录功能,需先登录再进行页面数据管理操作

需求

  1. 从页面输入的用户名和密码,和数据库中的用户信息进行比对,全部相同才可以登录成功
  2. 有一个信息不同则显示"错误,重新登录"
  3. 登录成功后才可以访问其他页面,比如列表页,新增页等
  4. 直接在浏览器中访问其他页面也要跳转到登录页进行登录后再操作

数据表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相关的操作和页面都是新添加进去的,所以要重新配置文件哦
相关推荐
神明不懂浪漫6 小时前
【第七章】Java中的常用类
java·开发语言·前端·经验分享·笔记
程序喵大人15 小时前
【C++进阶】STL容器与迭代器 - 01 STL 容器先解决元素放在哪里
开发语言·c++·stl
cui_ruicheng15 小时前
Python从入门到实战(十六):多进程编程
开发语言·python
Jelena1577958579216 小时前
电商运营分析数据比价接口实战:多平台价格监控与智能决策系统
java·大数据·数据库
wdfk_prog16 小时前
嵌入式面试真题第 15 题:不可恢复异常后的通用崩溃快照、调用栈保存与离线分析架构
linux·开发语言·面试·架构
晴空了无痕17 小时前
从 Go 基础到 K8s:一条可落地的 Go 服务端成长路线
开发语言·后端·golang·kubernetes
神明不懂浪漫17 小时前
【第五章】Java中的继承与多态
java·开发语言
神州世通17 小时前
解密企业通信安全防线:Avaya Aura 三层安全架构深度解析
开发语言·php
AC赳赳老秦18 小时前
企业工商公开信息采集分析:OpenClaw 批量查询企业工商信息,生成企业画像报告
大数据·开发语言·python·自动化·php·deepseek·openclaw
AI多Agent协作实战派19 小时前
AI多Agent协作系统实战(十七):凌晨4点,我的AI系统在“假装工作“——3个bug同时爆炸的5小时
java·前端·bug