web功能实现-记住用户名

一、环境

登录功能实现 一文

二、工程目录

登录功能实现 一文。

三、代码编写
1.前端页面_login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>登录</title>
</head>
<body>
	<form action="/loginServlet" method="post">
	 	<input type="text" placeholder="请输入用户名" value="${cookie.u.value} name="username"><br>
		<input type="password" name="password" placeholder="请输入密码"><br>
		<input type="checkbox" name="remember" value="true">记住用户名?
	 	<input type="submit" value="登录">
	</form>
</body>
</html>

*这里在密码输入框之后添加了“记住用户名?”的复选框

2.登录的Servlet_LoginServlet

@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet{
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    //设置字符编码
    req.setCharacterEncoding("utf-8");
    /*//获取用户名,密码
    String username = req.getParameter("username");
    String password = req.getParameter("password");
    //创建User对象
    User loginUser = new User();
    loginUser.setUsername(username);
    loginUser.setPassword(password);*/

    //获取请求对象数据并封装成map集合
    Map<String, String[]> map = req.getParameterMap();
    //创建User对象
    User loginUser = new User();
    try {
        //将map封装到loginUser对象中
        BeanUtils.populate(loginUser,map);
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    }
    //创建UserLoginDao对象
    UserLoginDao uld = new UserLoginDao();
    //调用UserLoginDao的login方法
    User user = uld.login(loginUser);
    //判断
    if (user ==null){
        //跳转到successServlet
        req.getRequestDispatcher("/failedServlet").forward(req,resp);
    }else {
        //设置共享域
        req.setAttribute("user",user);
        //将user中的用户名存储到Cookie中
        Cookie cookie = new Cookie("u", user.getUsername());
        //获取记住用户名复选框的值
        String remember = req.getParameter("remember");
        //判断
        if (remember.equals("true")){
            //如果登录成功,设置cookie的存活时间
            cookie.setMaxAge(7*24*60*60);
            //发送cookie到客户端
            resp.addCookie(cookie);
        }
        //跳转到failedServlet
        req.getRequestDispatcher("/successServlet").forward(req,resp);
    }
}

@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    this.doGet(req,resp);
	 }
}

*在判断登陆成功之后,转发之前,将username存储到了cookie中并将cookie发送到客户端

3.其他页面与登录功能实现 一文相同,无需修改
4.效果展示
在这里插入图片描述
*这里我依旧输入,账号:zhangsan,密码:123456,并且勾选了记住用户名的复选框

在这里插入图片描述
*登陆成功,并显示用户名

在这里插入图片描述
再次访问 http://localhost:8080/login.jsp

在这里插入图片描述
*发现用户名已经显示在用户名输入框中

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Shiro中实现记住我的功能,需要进行以下步骤: 1. 在Shiro配置文件中,开启cookie管理器和记住功能。具体配置如下: ``` # 开启cookie管理器 securityManager.sessionManager.sessionDAO = org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO securityManager.sessionManager.sessionIdCookieEnabled = true securityManager.sessionManager.sessionIdCookie = org.apache.shiro.web.servlet.SimpleCookie # 开启记住功能 securityManager.rememberMeManager = org.apache.shiro.web.mgt.CookieRememberMeManager securityManager.rememberMeManager.cookie = org.apache.shiro.web.servlet.SimpleCookie securityManager.rememberMeManager.cookie.name = rememberMe securityManager.rememberMeManager.cipherKey = 4AvVhmFLUs0KTA3Kprsdag== ``` 2. 在用户登录时,如果用户选择记住功能,则创建一个RememberMeCookie,并设置它的属性,如下: ``` if (rememberMe) { Cookie rememberMeCookie = new SimpleCookie("rememberMe"); rememberMeCookie.setMaxAge(7 * 24 * 60 * 60); // 设置cookie过期时间为一周 rememberMeCookie.setHttpOnly(true); rememberMeCookie.setValue("加密后的记住我信息"); response.addCookie(rememberMeCookie); } ``` 其中,加密后的记住我信息可以使用Shiro提供的RememberMeManager进行加密。 3. 在Shiro的过滤器链中,添加一个RememberMeFilter,用于判断是否存在记住功能的cookie,并自动登录用户。具体配置如下: ``` [filters] rememberMe = org.apache.shiro.web.filter.authc.RememberMeFilter [urls] /** = anon /login = authc /logout = logout /** = user, rememberMe ``` 其中,user表示需要认证的用户,rememberMe表示需要记住功能的用户。 4. 在Shiro的自定义Realm中,实现doGetAuthenticationInfo()方法,用于自动登录用户。具体实现如下: ``` @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { RememberMeAuthenticationToken rememberMeToken = (RememberMeAuthenticationToken) token; String rememberMeCookieValue = (String) rememberMeToken.getPrincipal(); // 解密记住功能的cookie String username = decryptRememberMeCookie(rememberMeCookieValue); // 查询用户信息 User user = userService.getUserByUsername(username); if (user == null) { throw new UnknownAccountException("用户不存在"); } // 构造AuthenticationInfo对象 SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( user.getUsername(), user.getPassword(), getName()); return authenticationInfo; } private String decryptRememberMeCookie(String cookieValue) { // 使用Shiro提供的RememberMeManager进行解密 CookieRememberMeManager rememberMeManager = new CookieRememberMeManager(); byte[] rememberMeKey = Base64.decode(rememberMeManager.getCipherKey()); CipherService cipherService = new DefaultCipherService(); Cipher cipher = cipherService.createCipher(rememberMeKey); byte[] decrypted = cipher.decrypt(Base64.decode(cookieValue)); return new String(decrypted); } ``` 其中,decryptRememberMeCookie()方法使用Shiro提供的RememberMeManager进行记住我信息的解密。在解密完成后,根据用户名查询数据库中的用户信息,并构造AuthenticationInfo对象返回。这样,当用户使用记住功能时,Shiro就能自动登录用户。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值