个人博客项目(2) --- 用户登录

用户登录

(一) JSON处理库

可以不用在人为的拼接JSON字符串,只需要向使用对象那样,设置完属性,调用转发方法,就可以将对象转换成JSON字符串。

JSON处理库有很多,最常用的就是jackson库,我们就使用它。

  1. 引入依赖
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  1. 把代码复制到项目pox.xml文件下的dependencies中
<!--    JSON 处理库-->
    <!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.12.1</version>
    </dependency>

(二) 将servlet通用代码封装到utils中

在每个servlet都会有很多通用的属性,比如

  • 设置编码和返回的类型
  • 还有就是用JSON格式进行返回值传递

接下来我们就把他们封装为ResultJDBCUtils用来统一接口处理

package utils;

import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;

/**
 * Created with IntelliJ IDEA.
 * Description:统一接口处理
 * User: starry
 * Date: 2021 -04 -06
 * Time: 16:05
 */
public class ResultJSONUtils {

    /**
     * 给前端输出json数据
     * @param response
     * @param data
     * @throws IOException
     */
    public static void write(HttpServletResponse response,
                             HashMap<String,Object> data) throws IOException {
        response.setCharacterEncoding("utf-8");
        response.setContentType("application/json");
        PrintWriter writer = response.getWriter();
        ObjectMapper mapper = new ObjectMapper();
        writer.println(mapper.writeValueAsString(data));
    }

}

随之我们把前一章写的用户注册的servlet改成用此工具类实现

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //返回给前端数据
        int succ = 0;   //1表示成功
        String msg = "";    //错误信息提示

        //1. 获取到前端提供的数据
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        String password2 = request.getParameter("password2");

        //非空效验
        if(username != null && !username.equals("") &&
        password != null && !password.equals("") &&
        password2 != null && !password2.equals("")) {
            if(!password.equals(password2)) {
                msg = "两次密码输入不一致";
            }
        }else {
            msg = "非法输入";
        }

        //2. 进行业务处理
        UserInfoDao userInfoDao = new UserInfoDao();
        try {
            userInfoDao.add(username,password);
            succ = 1;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

        //3. 返回结果
        HashMap<String,Object> hashMap = new HashMap<>();
        hashMap.put("succ",succ);
        hashMap.put("msg",msg);
        ResultJSONUtils.write(response,hashMap);
    }

(三) 前端登录页面

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
    <script src="jquery-1.9.1.min.js"></script>
    <script>
        function mysub(type) {
            //1. 通过输入的id获取值
            var username = jQuery("#username");
            var password = jQuery("#password");
            //2. 清空操作
            if(type == 2) {
                if(confirm("确认清空吗?")) {
                    username.val("");
                    password.val("");
                    return false;
                }
            }
            //3. 非空效验
            if(username.val().trim() == "") {
                //用户名为空
                alert("请先输入用户名");
                username.focus();
                return false;
            }
            if(password.val().trim() == "") {
                //密码为空
                alert("请先输入密码");
                password.focus();
                return false;
            }

            jQuery.getJSON("login",{
                "username":username.val(),
                "password":password.val()
            },function (data) {
                if(data != null && data.succ == 1) {
                    //登录成功
                    alert("恭喜,登录成功");
                }else {
                    alert("抱歉,登录失败:"+data.msg);
                }
            });

        }
    </script>
</head>
<body>
    <div style="margin-top: 100px;text-align: center">
        <h1>登录</h1>
        &nbsp;&nbsp;&nbsp;&nbsp:<input id="username" name="username" type="text"><p></p>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input id="password" name="password" type="password"><p></p>
        <input type="button" value="提 交" onclick="mysub(1)">
        <input type="button" value="清 空" onclick="mysub(2)">
    </div>
</body>
</html>

在这里插入图片描述

(四) 配置路由

  <!--登录-->
  <servlet>
    <servlet-name>login</servlet-name>
    <servlet-class>services.LoginServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>login</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>

(五) 编写dao层查询用户

在userInfoDao中加入addUser方法

    /**
     * 通过账号密码查询用户
     * @param username
     * @param password
     * @return
     * @throws SQLException
     */
    public UserInfo getUser(String username,String password) throws SQLException {
        UserInfo userInfo = new UserInfo();
        Connection connection = DBUtils.getConnection();
        String sql = "select * from userinfo where username=? and password=?";
        PreparedStatement statement = connection.prepareStatement(sql);
        statement.setString(1,username);
        statement.setString(2,password);
        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()) {
            userInfo.setId(resultSet.getInt("id"));
            userInfo.setUsername(resultSet.getString("username"));
            userInfo.setPassword(resultSet.getString("password"));
        }
        DBUtils.close(resultSet,statement,connection);
        return userInfo;
    }

(六) 设置登录功能servlet接口

package services;

import dao.UserInfoDao;
import models.UserInfo;
import utils.ResultJSONUtils;

import javax.servlet.ServletException;
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.sql.SQLException;
import java.util.HashMap;

/**
 * Created with IntelliJ IDEA.
 * Description:登录功能
 * User: starry
 * Date: 2021 -04 -06
 * Time: 16:32
 */
public class LoginServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doGet(request, response);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //返回前端参数
        int succ = -1;
        String msg = "";

        //1. 获得前端请求参数
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        //2. 处理业务(验证用户名和密码)
        //非空效验
        if(username != null && !username.equals("") &&
        password != null && !password.equals("")) {
            //参数格式正确,执行查询数据库
            UserInfoDao userInfoDao = new UserInfoDao();
            try {
                UserInfo userInfo = userInfoDao.getUser(username,password);
                if (userInfo.getId() > 0) {
                    //用户账号密码正确
                    succ = 1;
                    //创建会话
                    HttpSession session = request.getSession();
                    // 将用户信息存放到当前session
                    session.setAttribute("userInfo",userInfo);
                } else {
                    //用户账号密码不正确,未从数据库中查得
                    msg = "账号密码输入错误";
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }else {
            // 参数不完整,非法请求
            msg = "参数不完整,非法请求";
        }

        //3. 返回响应给前端
        HashMap<String,Object> hashMap = new HashMap<>();
        hashMap.put("succ",succ);
        hashMap.put("msg",msg);
        ResultJSONUtils.write(response,hashMap);
    }
}

最终效果

在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值