我是靠谱客的博主 小巧日记本,最近开发中收集的这篇文章主要介绍使用过滤器与cookie实现记住用户登录状态,自动登录功能,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、思路:

用户首次登录并选择了记住登录状态,向服务器发出登录请求,服务器收到请求后验证登录信息,如果用户信息认证成功,服务器将用户的登录信息存入cookie并响应给浏览器,接下来每次浏览器向服务器发出访问资源请求时,都会附带cookie信息,服务器认证cookie中的用户登录信息,如果成功则放行,否则让客户端删除cookie,重新登录认证。

二、流程图

在这里插入图片描述

三、代码实现

1、创建LoginServlet,获取用户输入的信息
		//处理乱码问题
        request.setCharacterEncoding("utf-8");
        //获取用户输入的信息
        String username = request.getParameter("username");
        String password = request.getParameter("password");
        //获取用户是否选择记住登录状态,如果auto为null则未选择
        String auto = request.getParameter("auto");
2、用户信息校验,以用户输入的信息作为参数,调用业务逻辑层的用户登录方法获取用户,该部分代码省略,此处代码采用将用户名和密码写死的方式认证
if ("admin".equals(username)&&"888".equals(password)){
	//用户登录信息正确,执行后续的代码
	//如果是从数据库中获取的用户,则将用户对象放入域中
	request.getSession().setAttribute("username", username);
}
3、将用户的信息保存到cookie中并重定向到资源页面
if ("admin".equals(username)&&"888".equals(password)){
	//用户登录信息正确,执行后续的代码
	//如果是从数据库中获取的用户,则将用户对象放入session域中
	request.getSession().setAttribute("username", username);
		//判断用户是否选择记住登录状态
    	if (auto!=null){
    		//将用户名与密码进行拼接
            String userinfo = username+"#"+password;
            //通过Base64编码进行信息加密
            userinfo = Base64.getEncoder().encodeToString(userinfo.getBytes("utf-8"));
            //创建名为"userinfo"的cookie
            Cookie cookie = new Cookie("userinfo",userinfo);
            //设置回传路径
            cookie.setPath(request.getContextPath());
            //设置cookie的有效期
            cookie.setMaxAge(60*60*24*7);
            //设置HttpOnly,使js脚本将无法读取到cookie信息,防止跨站脚本攻击
            cookie.setHttpOnly(true);
            //将cookie存入响应中
            response.addCookie(cookie);
		}
		//重定向到访问资源
		response.sendRedirect(request.getContextPath()+"/index.jsp");
	}
4、创建过滤器,拦截路径设置为资源路径,过滤资源的访问请求

	(1) 从session域获取用户,如果存在,则说明当前会话是登录状态,过滤器放行
//将请求和响应强转成HttpServletRequest类型
HttpServletRequest req = (HttpServletRequest)request;
HttpServletResponse resp = (HttpServletResponse)response;
//从session域获取用户
String username = (String) req.getSession().getAttribute("username");
	if (username!=null){
		//放行
		chain.doFilter(request, response);
	}
(2)认证cookie中的用户信息,如果认证成功则放行,失败则删除cookie(通过创建新的cookie放到resqonse中发给客户端的方式删除)
//在请求中获取cookie(浏览器发过来不止一个cookie)
Cookie[] cookies = req.getCookies();
		//如果没有cookie,不放行
        if (cookies!=null){
        	//遍历cookies,查找名为"userinfo"的cookie,若不存在,则不放行
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("userinfo")){
                    String value = cookie.getValue();
                    //对该cookie的值进行解密
                    String userinfo = new String(Base64.getDecoder().decode(value), "utf-8");
                    //将用户信息字符串拆分
                    String[] userinfos = userinfo.split("#");
                    //如果拆分后的字符串数组为空或者长度不等于2,则说明cookie有问题,删除cookie
                    if (userinfos!=null&&userinfos.length==2){
                    	//调用业务逻辑层的用户登录方法获取用户,该部分代码省略,此处代码采用将用户名和密码写死的方式认证,采用写死的形式认证
                        if ("admin".equals(userinfos[0])&&"888".equals(userinfos[1])){
                        	//认证成功,将用户名放入session域中
                            req.getSession().setAttribute("username", userinfos[0]);
                            //放行
                            chain.doFilter(request, response);
                            return;
                        }
                    }
                    //cookie存在问题或认证信息错误,删除cookie
                    //创建新的cookie
                    Cookie deleteCookie = new Cookie("userinfo","");
                    //设置回传路径
                    deleteCookie.setPath(req.getContextPath());
                    //设置过期时间为0(浏览器读到后删除cookie)
                    deleteCookie.setMaxAge(0);
                    //将cookie存进响应中
                    resp.addCookie(deleteCookie);
                }
            }
        }

最后

以上就是小巧日记本为你收集整理的使用过滤器与cookie实现记住用户登录状态,自动登录功能的全部内容,希望文章能够帮你解决使用过滤器与cookie实现记住用户登录状态,自动登录功能所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(60)

评论列表共有 0 条评论

立即
投稿
返回
顶部