概述
一、思路:
用户首次登录并选择了记住登录状态,向服务器发出登录请求,服务器收到请求后验证登录信息,如果用户信息认证成功,服务器将用户的登录信息存入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实现记住用户登录状态,自动登录功能所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复