但是好像不能用cookie保存用户信息,这是为甚呀

这个是登录的页面jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>User Login Page</title>
</head>
<body>
<% String lastUser = null;
   Cookie[] cs = request.getCookies();
   if(cs != null){
       for(Cookie c : cs){
           if(c.getName().equals("username")){
               lastUser = c.getValue();
               break;
           }
       }
   }
%>
    <h1>User Login Page</h1>
    <hr>
    <form action="login" method="POST">
        <label>
            name:
            <input type="text" name="name" value="<%= lastUser %>"><br>
        </label>
        <label>
            password:
            <input type="password" name="password"><br>
        </label>
        <label>
            remember me:
            <input type="checkbox" name="reme"><br>
        </label>
        <input type="submit" value="Log Me In">
    </form>
    <%
        String result = request.getParameter("result");
        if(result != null && result.equals("fail"))
        {
            out.println("<p style='color:red'>用户名或密码错误!</p >");
        }
    %>
</body>
</html>

这个是servlet用来暂时用cookie存储用户名和密码
package cookie;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/reme")
public class reme extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public reme() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String name = request.getParameter("name");
        String reme = request.getParameter("reme");
        if (reme != null) {
            Cookie c = new Cookie("username", name);
            c.setMaxAge(24*60*60*1000);
            response.addCookie(c);
        } else {
            Cookie[] cs = request.getCookies();
            if (cs != null) {
                for (Cookie c : cs) {
                    if (c.getName().equals("username")) {
                        c.setMaxAge(0);
                        response.addCookie(c);
                        break;
                    }
                }
            }
        }
        PrintWriter out = response.getWriter();
        out.println("<html><body>login with cookie</body></html> ");
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request, response);
    }
}
  1. Cookie过期时间设置不正确,你用了c.setMaxAge(246060*1000)
  2. Cookie路径设置不正确,代码中没有显式设置Cookie的路径
  3. 代码逻辑错误:代码中,如果reme参数为null,会把Cookie的过期时间设置为0并添加到响应中。但是,在检查reme参数之前,没有验证是否已经找到了相应的Cookie。这可能导致无法正确地处理Cookie
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/779016
  • 你也可以参考下这篇文章:通过cookie保存并读取用户登录信息
  • 除此之外, 这篇博客: 前后端跨域cookie无法保存问题中的 后端设置: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.cors.CorsConfiguration;
    import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
    import org.springframework.web.filter.CorsFilter;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * @author : Jenson.Liu
     * @date : 2020/2/3  7:47 下午
     */
    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
        private CorsConfiguration buildConfig() {
            CorsConfiguration corsConfiguration = new CorsConfiguration();
            corsConfiguration.setAllowCredentials(true); //允许接受cookie
            corsConfiguration.setMaxAge(1000L);
            corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
            corsConfiguration.addAllowedHeader("*"); // 2允许任何头
            corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
            return corsConfiguration;
        }
    
        @Bean
        public CorsFilter corsFilter() {
            UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
            source.registerCorsConfiguration("/**", buildConfig()); // 4
            return new CorsFilter(source);
        }
    }
    
    

    对于设置cookie的接口

       @ResponseBody
        @RequestMapping(value = "/login", method = RequestMethod.POST)
        public String login(HttpServletResponse response,HttpServletRequest request, @RequestBody HashMap<String,String> map) {
            logger.info("username:"+map.get("username"));
            String token = TokenTool.createToken("username");
            Cookie cookie=new Cookie("token",token);
            cookie.setDomain(request.getServerName());
            cookie.setPath(request.getContextPath());
            cookie.setMaxAge(60*60*24);
            cookie.setHttpOnly(false);
            response.addCookie(cookie);
            return TokenTool.createToken("username");
        }

    这里tooken就可以设置到前端域里面。

  • 您还可以看一下 刘海龙老师的渗透测试视频教程课程中的 COOKIE注入小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据参考资料中的内容推断,可能是跨域问题导致了无法使用cookie保存用户信息。因此,需要处理跨域问题,具体可以按照参考资料中提供的方案进行配置处理。

    配置跨域问题需要在后端进行,可以按照参考资料中提供的代码进行配置。需要注意的是,该代码中设置了允许任何来源的请求(addAllwdOrigin("*")),需要根据实际情况进行调整。

    除了使用cookie,还有其他替代方案来保存用户信息,比如: 1. 使用session:服务器使用session来保存用户信息,客户端每次请求时携带session ID,服务器根据session ID获取对应的session中的用户信息。 2. 使用JWT:服务器生成一个JSON Web Token(JWT),包含用户信息,并将其返回给客户端,客户端每次请求需要携带JWT,服务器验证JWT并获取其中的用户信息。

    需要根据实际情况进行选择和实现,具体可以参考相关文档和代码示例。

是否正确配置了@WebServlet注解,要确保URL模式"/reme"与您的应用程序的web.xml文件中的URL模式一致。
另外你的浏览器是否是隐身模式,或者禁用cookie
浏览器f12看下,服务器发了 setcookie 指令了没有