用户登录
用户登录
(一) JSON处理库
可以不用在人为的拼接JSON字符串,只需要向使用对象那样,设置完属性,调用转发方法,就可以将对象转换成JSON字符串。
JSON处理库有很多,最常用的就是jackson库,我们就使用它。
- 引入依赖
- 把代码复制到项目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>
用 户 名 :<input id="username" name="username" type="text"><p></p>
密 码 :<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);
}
}