使用Filter实现用户自动登录

本文介绍如何利用Filter实现用户自动登录功能。通过创建User类、登录注销Servlet和过滤器,当用户携带Cookie访问时,Filter会校验信息,确保用户自动登录的成功。
摘要由CSDN通过智能技术生成

我们知道Cookie可以实现用户自动登录的功能。当用户浏览器第一次访问服务器时,服务器会发送一个包含用户信息的Cookie。

之后,当客户端再次访问服务器时,会向服务器回送Cookie。

这样服务器就可以从Cookie中获取用户信息,从而实现用户的自动登录功能。

Filter程序中可以实现Cookie的校验,由于Filter可以对服务器的所有请求进行拦截,因此,一旦请求通过Filter程序,就相当于用户信息校验通过,Servlet程序根据获取到的用户信息,就可以实现自动登录了。

接下来写详细步骤,每一步都到位

1.编写User类

在项目中新建entity包,他的意思是实体,在该包中编写User类,该类用于封装用户的信息

package entity;

public class User {
	private String username;
	private String password;
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}

创建登录页面

下一个login.jsp

这个页面用于创建一个用户登录的表单,这个表单需要填写用户名和密码,以及自动登录的时间。

<%@ page language="java" contentType="text/html; charset=utf-8"
    pageEncoding="utf-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>用户登录</title>
</head>
<center><h3>用户登录</h3></center>
<body style="text-align:center;">
<form action="${pageContext.request.contextPath }/loginServlet" method="post"> 
<table border="1" width="600px" cellpadding="0" cellspacing="0" align="center">
	<tr>
		<td height="30" align="center">用户名:</td>
		<td>&nbsp;&nbsp;<input type="text" name="username">${errer
以下是使用Filter实现用户自动登录的代码示例: ```java public class AutoLoginFilter implements Filter { private final String LOGIN_PAGE = "/login.jsp"; private final String LOGIN_ACTION = "/login"; private final String USERNAME_PARAM = "username"; private final String PASSWORD_PARAM = "password"; private final String REMEMBER_ME_PARAM = "rememberMe"; private final String REMEMBER_ME_COOKIE_NAME = "rememberMeCookie"; private final int REMEMBER_ME_COOKIE_MAX_AGE = 7 * 24 * 60 * 60; private UserService userService; @Override public void init(FilterConfig filterConfig) throws ServletException { ServletContext servletContext = filterConfig.getServletContext(); ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(servletContext); userService = context.getBean(UserService.class); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; HttpSession session = httpRequest.getSession(); // 如果用户已经登录,则直接放行 if (session.getAttribute("user") != null) { chain.doFilter(request, response); return; } // 如果用户访问的是登录页面,则直接放行 if (httpRequest.getRequestURI().endsWith(LOGIN_PAGE)) { chain.doFilter(request, response); return; } // 如果用户提交的是登录请求,则进行自动登录处理 if (httpRequest.getRequestURI().endsWith(LOGIN_ACTION)) { String username = httpRequest.getParameter(USERNAME_PARAM); String password = httpRequest.getParameter(PASSWORD_PARAM); String rememberMe = httpRequest.getParameter(REMEMBER_ME_PARAM); User user = userService.getUserByUsernameAndPassword(username, password); if (user != null) { // 将用户信息保存到session中 session.setAttribute("user", user); // 如果用户选择了“记住我”选项,则创建一个cookie保存用户信息 if ("true".equals(rememberMe)) { Cookie cookie = new Cookie(REMEMBER_ME_COOKIE_NAME, username + ":" + password); cookie.setMaxAge(REMEMBER_ME_COOKIE_MAX_AGE); httpResponse.addCookie(cookie); } // 登录成功,跳转到首页 httpResponse.sendRedirect(httpRequest.getContextPath() + "/index.jsp"); } else { // 登录失败,返回登录页面并显示错误信息 httpRequest.setAttribute("error", "用户名或密码错误"); httpRequest.getRequestDispatcher(LOGIN_PAGE).forward(request, response); } return; } // 如果用户访问的是其他页面,则尝试自动登录 Cookie[] cookies = httpRequest.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals(REMEMBER_ME_COOKIE_NAME)) { String value = cookie.getValue(); String[] parts = value.split(":"); String username = parts[0]; String password = parts[1]; User user = userService.getUserByUsernameAndPassword(username, password); if (user != null) { // 将用户信息保存到session中 session.setAttribute("user", user); // 自动登录成功,放行 chain.doFilter(request, response); return; } } } } // 如果无法自动登录,则跳转到登录页面 httpResponse.sendRedirect(httpRequest.getContextPath() + LOGIN_PAGE); } @Override public void destroy() { // do nothing } } ``` 在上面的代码中,我们定义了一个名为`AutoLoginFilter`的过滤器,用于实现用户自动登录功能。该过滤器具有以下特点: 1. 当用户访问的是登录页面时,直接放行,不进行任何操作。 2. 当用户提交的是登录请求时,如果用户名和密码正确,则将用户信息保存到session中,并根据用户是否选择了“记住我”选项,创建或删除一个Cookie来保存或清除用户信息。然后将用户重定向到首页。如果用户名和密码错误,则返回登录页面并显示错误信息。 3. 当用户访问的是其他页面时,首先尝试从Cookie中获取用户信息进行自动登录。如果能够自动登录,则将用户信息保存到session中,并直接放行。如果无法自动登录,则重定向到登录页面。 需要注意的是,在上面的代码中,我们使用了Spring框架的依赖注入功能,从而可以轻松地获取`UserService`对象,用于查询数据库中的用户信息。如果您没有使用Spring框架,可以将`UserService`替换为自己的用户服务类。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值