JavaWeb之实现简单的自动登录

用最近所学的知识点实现自动登录,主要有:

  1. Filter过滤器
  2. session & cookie

一、需求分析

在这里插入图片描述
在这里插入图片描述

二、准备工作

1. 项目目录

在这里插入图片描述

2. 导入相应的jar包

在这里插入图片描述

三、代码实现

1. 搭建环境
1.1 搭建数据库、数据库表

数据库【user】,数据库表【t_user】
在这里插入图片描述

1.2 搭建页面
  1. 登录页面【login.jsp】
<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>
  1. 首页【index.jsp】
    注意:导入
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<body>
	这是首页,
	<c:if test="${not empty userBean }">
		欢迎你,${userBean.username }
	</c:if>
	<c:if test="${empty userBean }">
		你好,请登录!
	</c:if>
	
</body>
2. 登录servlet代码【LoginServlet.java】
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		try {
			String userName = request.getParameter("username");
			String password = request.getParameter("password");
			String autoLogin = request.getParameter("auto_login");
			
			UserBean user = new UserBean();
			user.setUsername(userName);
			user.setPassword(password);
			
			UserDao dao = new UserDaoImpl();
			UserBean userBean = dao.login(user);
			
			if(userBean != null) {
				//成功了,进入首页
				
				request.getSession().setAttribute("userBean", userBean);
				response.sendRedirect("index.jsp");
			}else {
				//不成功
				request.getRequestDispatcher("login.jsp").forward(request, response);
			}
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
3. 过滤器filter代码【AutoLoginFilter.java】

实现思路:

  1. 先判断session是否有效,如果有效,就不用取cookie了,直接放行;
  2. 如果session失效了,那么就取cookie。
    a. 取出cookie的值,然后完成登录;
    b. 把这个用户的值存储到session中;
    c. 放行。
	public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		
		try {
			HttpServletRequest request = (HttpServletRequest) req;
			
			//先判断,session中还有没有userBean
			UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
			//有---session有效
			if(userBean != null) {
				 chain.doFilter(request, response);
			}else {//session失效了----看cookie
				
				//1.来请求的时候,先从请求里面取出cookie,但是cookie里有很多的key-value
				Cookie[] cookies = request.getCookies();
				//2.从一堆的cookie里面找出以前给浏览器发的那个cookie
				Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
				
				//第一次登录
				if(cookie == null) {
					chain.doFilter(request, response);
				}else {//不是第一次登录
					String value = cookie.getValue();
					String username = value.split("#")[0];
					String password = value.split("#")[1];
					
					//完成登录
					UserBean user = new UserBean();
					user.setUsername(username);
					user.setPassword(password);

					UserDao dao = new UserDaoImpl();
					userBean = dao.login(user);
					
					//将session值存到域中,方便下一次未过期前还可以用
					request.getSession().setAttribute("userBean", userBean);
					
					chain.doFilter(request, response);
				}				
				
			}

		} catch (Exception e) {
			e.printStackTrace();
			chain.doFilter(req, response);
		}
	}
4. 其他代码
4.1 方法findCookie()

作用:从一堆的cookie里面找出以前给浏览器发的那个cookie
【CookieUtil.java】

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;	
	} 
}
4.2 Bean类

【UserBean.java】

public class UserBean {
	
	private int id;
	private String username;
	private String password;
	
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	
	
}
4.3 UserDao & UserDaoImpl
  1. UserDao.java
public interface UserDao {
	/**
	 * 执行登录,并且返回该用户所有的信息
	 * @param user  执行登录的用户信息
	 * @return
	 */
	UserBean login(UserBean user) throws SQLException;
}
  1. UserDaoImpl.java
public class UserDaoImpl implements UserDao {

	@Override
	public UserBean login(UserBean user) throws SQLException {
		
		QueryRunner runner = new QueryRunner(JDBCUtil02.getDataSource());
		String sql = "select * from t_user where username = ? and password = ?";
		return runner.query(sql, new BeanHandler<UserBean>(UserBean.class),user.getUsername(),user.getPassword());
		
	}

}
  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Web中,可以通过使用Cookie实现用户自动登录。具体步骤如下: 1. 当用户登录成功后,服务器端可以生成一个唯一的令牌(例如UUID),并将令牌存储到数据库中,同时将令牌写入Cookie中,设置Cookie的过期时间。 2. 当用户再次访问网站时,服务器端会读取用户浏览器中的Cookie信息,从中提取出令牌。 3. 服务器端根据令牌查询数据库,如果令牌有效,则表示用户已经登录过,可以直接跳转到用户的个人中心页面,否则跳转到登录页面。 4. 当用户点击注销按钮时,服务器端会删除数据库中的令牌,并将Cookie中的令牌过期。 下面是一个简单的示例代码: ```java // 登录成功后生成令牌并将令牌写入Cookie中 String token = UUID.randomUUID().toString(); response.addCookie(new Cookie("token", token)); // 将令牌存储到数据库中 userDao.saveToken(userId, token); // 在过滤器中检查Cookie中是否存在令牌 String token = null; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("token")) { token = cookie.getValue(); break; } } } // 如果令牌存在,则说明用户已经登录过 if (token != null && userDao.isValidToken(userId, token)) { // 跳转到用户的个人中心页面 response.sendRedirect("/user/profile"); } else { // 跳转到登录页面 response.sendRedirect("/login"); } // 用户点击注销按钮后,删除数据库中的令牌并将Cookie中的令牌过期 userDao.deleteToken(userId); Cookie cookie = new Cookie("token", ""); cookie.setMaxAge(0); response.addCookie(cookie); ``` 需要注意的是,使用Cookie实现自动登录需要考虑到安全性问题,例如令牌的过期时间、令牌的随机性、令牌的加密等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值