Session 优化登录案例

Session 优化登录案例

1.代码实现


public class LoginServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置请求编码格式
		request.setCharacterEncoding("utf-8");
		//设置响应编码格式
		response.setContentType("text/html;charset=utf-8");
		//获取session中的数据
		HttpSession session=request.getSession();
		String str=((String) session.getAttribute("flag")==null?" ":"用户名或密码错误");
		session.invalidate();
		//获取请求信息
		//处理请求信息
		//响应处理结果
			//直接响应
			response.getWriter().write("<html>");
			response.getWriter().write("<head>");
			response.getWriter().write("</head>");
			response.getWriter().write("<body>");
			response.getWriter().write("<form action='user' method='get' />");
			response.getWriter().write("<font>"+str+"</font>");
			response.getWriter().write("用户名:<input type='text'name='uname'value=''/><br />");
			response.getWriter().write("密码:<input type='password'name='pwd'value=''/><br />");
			response.getWriter().write("<input type='submit' value='登录'/><br />");
			response.getWriter().write("</form>");
			response.getWriter().write("</body>");
			response.getWriter().write("</html>");
	}
}


public class UserServlet extends HttpServlet {
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//设置请求编码格式
		request.setCharacterEncoding("utf-8");
		//设置响应编码格式
		response.setContentType("text/html;charset=utf-8");
		//获取请求信息
		String uname=request.getParameter("uname");
		String pwd=request.getParameter("pwd");
		//处理请求信息
		if("zhangsan".equals(uname)&&"123".equals(pwd)) {
			//登录成功
		}else {
			//登录失败
			//获取session对象
			HttpSession session=request.getSession();
			session.setAttribute("flag","false");
			//响应处理结果(重定向到login)
			response.sendRedirect("login");
			
		}
	}

}

2.过程阐述

在登录失败的操作中 使用session技术设置了flag标志 将其保存到session对象中 而重定向到login时 通过session对象拿到标志 从而可以提示用户名或密码错误 完成需求

3.具体细节分析

在这里插入图片描述
当我们第一次访问login时 可以在响应头中看到有一个Set-Cookie,这个cookie携带了第一次的session对象 但马上session对象就被销毁 接着进入登录步骤
在这里插入图片描述
这时我们输入错误的用户名和密码 浏览器首先向/user发起一个请求,这个请求的请求头中携带了刚刚被销毁的session的ID,随即我们在响应头中看到这是服务器有给我们了一个新的Set-Cookie,即有新创建了一个session对象 这个session对象中写入了flag信息(用户名或密码错误的信息)这时可能会产生一个疑问 明显请求中已经拿到了一个session-ID 为什么有创建了一个session对象 这时因为该session对象已经被销毁了 就算有session-ID也会重新创建一个session
在这里插入图片描述

这时 我们来看login这个重定向请求 可以看到这个请求的请求头中拿到了一个session 并且这个session-ID和上一个响应头中的session-ID一样 说明这是同一个session对象 那么他们所保存的flag标记信息就是一样的 这样就可以完成我们对于用户名或密码错误的提示需求 完成之后 我们销毁了session对象

4.bug记录

我们试着不对session进行销毁 就会发现以下的问题 在每一次刷新login时 都会提示用户名或密码错误 如图

在这里插入图片描述

原因是如果不对session对象进行销毁 在浏览器不关闭 session对象不失效的情况下 用户的任意请求获取的都是同一个session对象 那么就会一直提示这句话 在用户正常刷新之后 也会出现如上的错误情况 造成功能的错误

5.总结

1.浏览器发起请求到ServletA 在ServletA中获取到session对象 如果此次请求中没有session-ID就创建一个session对象 如果有session-ID就将其对应的session对象返回(前提是该session对象没有到期销毁 如果session对象销毁了 就算有session-ID也会重新创建一个session对象 上面的过程就是这样的体现

2.session的作用域:在浏览器不关闭且session不失效的情况下 同一用户的任意请求都获取的是一个session

发布了39 篇原创文章 · 获赞 19 · 访问量 1496

猜你喜欢

转载自blog.csdn.net/weixin_44222272/article/details/104487532