实现自动登录功能

学了过滤器之后,就结合了前面的知识简单的去实现了一下自动登录的功能

原理实现

使用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&amp", "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;
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值