学无先后,达者为师

网站首页 编程语言 正文

浏览器获取不到服务器端添加的Cookie

作者:cpt_ljy 更新时间: 2022-03-14 编程语言

记录一下java学习过程中的bug

cookie.setPath、setMaxAge都设置了,但是在登录页面读取不到添加的cookie信息

后端LoginServlet界面

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//接收数据
		String username = request.getParameter("username");
		String password = request.getParameter("password");
		//从ServletContext域中获得保存用户信息集合;
		List<User> list= (List<User>) this.getServletContext().getAttribute("list");
		for(User user:list) {
			//判断用户名是否正确
			if(username.equals(user.getUsername())) {
				//用户名是正确的
				if(password.equals(user.getPassword())) {
					//密码也正确
					//登录成功
					//将用户信息保存到session中:
					request.getSession().setAttribute("user", user);
					response.sendRedirect(request.getContextPath()+"/success.jsp");	
					//完成记住用户名的功能
					String remeber= request.getParameter("remeber");
					if("true".equals(remeber)) {
						Cookie cookie = new Cookie("username",user.getUsername());
						//设置有效的路径和有效时间
						cookie.setPath("/reg_login");
						cookie.setMaxAge(60*60*24);//24hour
						//将cookie回写到浏览器
						response.addCookie(cookie);
					}		
					return;
				}
			}
		}
		//登陆失败;
		request.setAttribute("msg", "用户名或密码错误");
		request.getRequestDispatcher("/login.jsp").forward(request, response);		
	}

前端Login.jsp界面

<%
		String username = "";
		//获得从客户端携带过来的所有Cookie
		Cookie[] cookies = request.getCookies();
		//从Cookie的数组中查找指定名称的Cookie
		Cookie cookie  = CookieUtils.findCookie(cookies,"username");
		if(cookie !=null){
			username = cookie.getValue();
		}		
%>

然后cookie信息不起作用,在login.jsp页面添加打印cookie信息代码,发现LoginServet中cookie信息并没有回传到浏览器,也就是说response.addCookie(cookie);没有起作用。

 <%
        String userName = "";
        //获得从客户端携带过来的所有cookie
        Cookie[]cookies = request.getCookies();
        //从Cookie的数组中查找指定名称的Cookie
        for(Cookie cookie:cookies){
          System.out.println("cookie.Name:"+cookie.getName());
          System.out.println("cookie.value:"+cookie.getValue());
          if(cookie.getName().equals("userName")){
            userName = cookie.getValue();
          }
        }
  %>

在这里插入图片描述
搜了好长时间没找到想要的解决方案,最终在https://www.cnblogs.com/woestave/p/6260526.html中找到了答案。

错误:

因为在LoginServlet页面中,登录成功后response.sendRedirect(request.getContextPath()+"/success.jsp"); 已经把请求转发给另一个页面了,所以虽然也创建了cookie,并能输出cookie.getName(),但是response已经不具备向浏览器响应请求的能力了,response.addCookie(cookie)也就不起作用

解决方案:

       for(User user:list){
            if(user.getUsername().equals(userName)){
                if(user.getPassword().equals(password)){
                    //完成记住用户名的功能
                    String remember = request.getParameter("remember");
                    if("true".equals(remember)){
                        Cookie cookie = new Cookie("userName",userName);
                        cookie.setPath(request.getContextPath());
                        cookie.setMaxAge(60*60*24);
                        response.addCookie(cookie);
                    }
                    //登录成功,重定向到成功页面
                    request.getSession().setAttribute("user",user);
                    response.sendRedirect(request.getContextPath()+"/success.jsp");
                    return;
                }
            }
        }

原文链接:https://blog.csdn.net/cpt_ljy/article/details/103764352

栏目分类
最近更新