java实现完善的登录验证流程

对所学内容回顾与分享的笔记记录,包含全流程与源码

实现功能

相对完善的登录界面流程,按数据库中存储用户名账号密码核对判断能否正常登录,用户的账号注册与账号名查重,,服务端根据用户勾选的选项实现返回cookie对登录状态持久化以及session保存

image-20220919220111996

流程调用关系图

使用技术

java, servlet, mybatis, mysql, tomcat

项目内容列表

image-20220919214707873

实现步骤

这里以程序编写思路记录实现步骤

数据层

pojo包

简单类型java对象(Plain Ordinary Java Object),创建被操作管理数据库中要使用到的数据类型

package com.slaine.pojo;

public class User {
    
    
    private Integer id;
    private String username;
    private String passwd;

    public Integer getId() {
    
    
        return id;
    }

    public void setId(Integer id) {
    
    
        this.id = id;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getpasswd() {
    
    
        return passwd;
    }

    public void setpasswd(String passwd) {
    
    
        this.passwd = passwd;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", passwd='" + passwd + '\'' +
                '}';
    }
}

mapper包

对pojo包中不同类型数据进行具体操作和管理,操作实现简单时可通过注解写在接口中,复杂时写在xml中

package com.slaine.mapper;

import com.slaine.pojo.User;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    
    

    //用户名和密码在数据库查询对象
    @Select("select * from tb_user where username = #{username} and passwd = #{passwd}")
    User select(@Param("username") String username, @Param("passwd") String passwd);

    //  验证用户名是否存在
    @Select("select * from tb_user where username = #{username}")
    User selectByUsername(String username);
    //添加用户操作
    @Insert("insert into tb_user values(null,#{username},#{passwd})")
    void add(User user);

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.slaine.mapper.UserMapper">

</mapper>

业务层

Until包

用静态方法一次创建SqlsessionFactory对象方便之后Service中多次调用优化性能

package com.slaine.util;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;

public class SqlSessionFactoryUtils {
    
    

    public static SqlSessionFactory sqlSessionFactory;

    static {
    
    


            String resource = "mybatis-config.xml";
            try {
    
    
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch (IOException e) {
    
    
                throw new RuntimeException(e);
            }
    }

    public  static SqlSessionFactory getSqlSessionFactory(){
    
    
        return sqlSessionFactory;
    }



}

service包

业务层具体对表现层前端用户输入账密传输到后端数据库校验判定,通过时则正常通过,并根据选项来选择是否返回cookie持久化登录并保存session

package com.slaine.service;

import com.slaine.mapper.UserMapper;
import com.slaine.pojo.User;
import com.slaine.util.SqlSessionFactoryUtils;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;

public class UserService {
    
    

    SqlSessionFactory factory = SqlSessionFactoryUtils.getSqlSessionFactory();

    public User login(String username, String passwd) {
    
    

        SqlSession sqlSession = factory.openSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.select(username,passwd);

        sqlSession.close();

        return user;
    }

    public boolean register(User user){
    
    

        SqlSession sqlSession = factory.openSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User u = mapper.selectByUsername(user.getUsername());

        if (u == null){
    
    
            mapper.add(user);
            sqlSession.commit();
        }
        sqlSession.close();

        return  u == null;
    }
}

表现层

web包

package com.slaine.web;

import com.slaine.pojo.User;
import com.slaine.service.UserService;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
    
    
    private UserService service = new UserService();

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        //1. 获取用户名和密码
        String username = request.getParameter("username");
        String passwd = request.getParameter("passwd");

        //获取复选框数据
        String remember = request.getParameter("remember");

        //2. 调用service查询
        User user = service.login(username, passwd);

        //3. 判断
        if(user != null){
    
    
            //登录成功,跳转到查询所有的BrandServlet

            //判断用户是否勾选记住我
            if("1".equals(remember)){
    
    
                //勾选了,发送Cookie

                //1. 创建Cookie对象
                Cookie c_username = new Cookie("username",username);
                Cookie c_passwd = new Cookie("passwd",passwd);
                // 设置Cookie的存活时间
                c_username.setMaxAge( 60 * 60 * 24 * 7);
                c_passwd.setMaxAge( 60 * 60 * 24 * 7);
                //2. 发送
                response.addCookie(c_username);
                response.addCookie(c_passwd);
            }

            //将登陆成功后的user对象,存储到session
            HttpSession session = request.getSession();
            session.setAttribute("user",user);

            String contextPath = request.getContextPath();
            response.sendRedirect(contextPath+"/selectAllServlet");
        }else {
    
    
            // 登录失败,

            // 存储错误信息到request
            request.setAttribute("login_msg","用户名或密码错误");

            // 跳转到login.jsp
            request.getRequestDispatcher("/login.jsp").forward(request,response);

        }
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        this.doGet(request, response);
    }
}

猜你喜欢

转载自blog.csdn.net/NZXHJ/article/details/126943601