简单的登录与注销
DAO实现用户名和密码
首先在数据库中创建表 t_user:
然后实现DAO:
User.java:
import lombok.Data;
@Data
public class User {
private Long id;
private String username;
private String password;
}
IUserDAO.java:
import java.util.List;
import com.cherry.shopping.damain.Product;
import com.cherry.shopping.damain.User;
public interface IUserDAO {
/**
* 根据账号其查询该账号对应的用户对象
* @param username
* @return User
*/
User getUserByUsername(String username);
}
UserDAOImpl.java:
import java.sql.ResultSet;
import java.sql.SQLException;
import com.cherry.shopping.damain.User;
import com.cherry.shopping.dao.IUserDAO;
import com.cherry.shopping.template.IResultSetHandler;
import com.cherry.shopping.template.JdbcTemplate;
public class UserDAOImpl implements IUserDAO {
public User getUserByUsername(String username) {
String sql = "SELECT * FROM t_user WHERE username = ?";
return JdbcTemplate.query(sql, new IResultSetHandler<User>() {
public User handle(ResultSet rs) throws SQLException {
if (rs.next()) {
User user = new User();
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
return user;
}
return null;
}
}, username);
}
}
UserDAOTest.java:
import org.junit.Test;
import com.alibaba.druid.proxy.jdbc.DatabaseMetaDataProxyImpl;
import com.cherry.shopping.damain.User;
import com.cherry.shopping.dao.IUserDAO;
import com.cherry.shopping.dao.impl.UserDAOImpl;
public class UserDAOTest {
private IUserDAO dao = new UserDAOImpl();
@Test
public void testGetUserByUsername() throws Exception {
String username = "cherry";
User user = dao.getUserByUsername(username);
System.out.println(user);
}
}
以上实现了后台对用户名密码的查询测试。
在Servlet中检查登录
LoginServlet.java:
import java.io.IOException;
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 com.cherry.shopping.damain.User;
import com.cherry.shopping.dao.IUserDAO;
import com.cherry.shopping.dao.impl.UserDAOImpl;
//处理登录请求
@WebServlet("/login")
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 6573993259552838436L;
private IUserDAO dao;
public void init() throws ServletException {
dao = new UserDAOImpl();
}
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
//1.接收请求参数
String username = req.getParameter("username");
String password = req.getParameter("password");
//2.调用业务方法,处理请求
User user = dao.getUserByUsername(username);
//3控制界面跳转
if (user == null) {
req.setAttribute("error", "账号不存在");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
return;
}
if (!user.getPassword().equals(password)) {
req.setAttribute("error", "账号或密码不正确");
req.getRequestDispatcher("/login.jsp").forward(req, resp);
return;
}
resp.sendRedirect("/product");
}
}
login.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Login</title>
</head>
<body>
<h3>用户登录</h3>
<span style="color:red">${error}</span>
<form action="/login" method="POST">
账号:<input type="text" name="username" required></br>
密码:<input type="password" name="password" required></br>
<input type="submit" value="登录">
</form>
</body>
</html>
将登录信息存入Session
我们不希望隔了很长时间或者其他人利用其他浏览器就可以登录,因此需要将登录用户对象存入session
req.getSession().setAttribute("USER_IN_SESSION", user);
就这一句话即可,然后在 JSP 中取出:
<div align="center">
当前登录用户${sessionScope.USER_IN_SESSION.username}
</div>
当然还可以设置session存活时间等属性,这里省略。
然后还需要才列表显示页面和添加商品页面检查登录,若没有登录则无法访问:
//检查是否登录,判断Sesion中是否有对象
Object user = req.getSession().getAttribute("USER_IN_SESSION");
if (user == null) {
resp.sendRedirect("/login.jsp");
return;
}
注销
注销很简单,可以单独写一个 Servlet 处理,也可以在 JSP 中写 Java 代码,当然后者更简单:
只需要在 login.jsp 中添加:
<%
//销毁session
session.invalidate();
%>
当然需要将注销登录的超链接指向 login.jsp 因此当再次访问 login.jsp 的时候,就会清除 session 的内容。
<div align="center">
当前登录用户${sessionScope.USER_IN_SESSION.username}
<a href="/login.jsp">注销登录</a>
</div>