学了过滤器之后,就结合了前面的知识简单的去实现了一下自动登录的功能
原理实现
使用cookie保存用户信息,实现下次访问不需要重新输入密码登录。用户发起请求,经过过滤器,查看cookie的值是否为空,是则代表第一次登录,然后进行正常的登录,否则,取出cookie中的内容,然后实现登录。
JSP页面
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="LoginServlet" method="post">
账号:<input type="text" name="username"><br>
密码:<input type="password" name="password"><br>
<input type="checkbox" name="auto_login">自动登录<br>
<input type="submit" value="登录">
</form>
</body>
</html>
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<c:if test="${empty user }">
<h3>账号或密码错误,请重新登录</h3>
</c:if>
<c:if test="${not empty user }">
<h3>欢迎${user.username }</h3>
</c:if>
</body>
</html>
过滤器Filter
AutoLoginFilter.java
package filter;
import java.io.IOException;
import java.net.URLDecoder;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import dao.UserDao;
import pojo.User;
import util.CookieUtil;
public class AutoLoginFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
User user = (User) request.getSession().getAttribute("user");
// 先确定session还有没有那个用户
if (user != null) {// 还存在,session有效
chain.doFilter(request, response);
}else {// session失效
// 当session失效的时候,再判断cookie
// 请求的时候,取出里面的cookie
Cookie[] cookies = request.getCookies();
// 从一堆cookie中找出以前发给客户端的那个cookie
Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
if (cookie == null) {// 代表第一次登录
chain.doFilter(request, response);
}else {// 不是第一次登录了
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
String username = value.split("_")[0];
String password = value.split("_")[1];
// 实现登录
User user01 = new User();
user01.setUsername(username);
user01.setPassword(password);
// 调用数据库,实现登录功能
UserDao dao = new UserDao();
user = dao.login(user01);
System.out.println(user);
// 继续把user存入session中,方便下次的使用
request.getSession().setAttribute("user", user);
chain.doFilter(request, response);
}
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
}
控制器Servlet
LoginServlet.java
package servlet;
import java.io.IOException;
import java.net.URLDecoder;
import java.net.URLEncoder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import dao.UserDao;
import pojo.User;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=utf-8");
// 获取参数
String username = request.getParameter("username");
String password = request.getParameter("password");
String auto_login = request.getParameter("auto_login");
// 将参数内容存入bean对象
User user01 = new User();
user01.setUsername(username);
user01.setPassword(password);
// 调用数据库,实现登录功能
UserDao dao = new UserDao();
User user = dao.login(user01);
if (user != null) {// 登录成功
if ("on".equals(auto_login)) {// 如果选了自动登录
// 发送cookie给客户端
Cookie cookie = new Cookie("auto_login",URLEncoder.encode(username + "_" + password, "utf-8"));
cookie.setMaxAge(60*24*24*7);
cookie.setPath("/AutoLogin");
response.addCookie(cookie);
}
// 进入首页,将用户保存至session
request.getSession().setAttribute("user", user);
response.sendRedirect("/AutoLogin/index.jsp");
}else {
// 登录不成功,返回登录页面
request.getRequestDispatcher("login.jsp").forward(request, response);
}
}
}
数据访问层DAO
UserDao.java
package dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import pojo.User;
public class UserDao {
public User login(User user) {
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/mldn?serverTimezone=UTC&", "root", "YZQ.yzq.123");
ps = conn.prepareStatement("select * from user where username=? and password=?");
ps.setString(1, user.getUsername());
ps.setString(2, user.getPassword());
rs = ps.executeQuery();
if (rs.next()) {
return user;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return null;
}
}
工具类
CookieUtil.java
package util;
import javax.servlet.http.Cookie;
public class CookieUtil {
public static Cookie findCookie(Cookie[] cookies,String name) {
if (cookies != null) {
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())){
return cookie;
}
}
}
return null;
}
}