JSP Servlet无法添加Cookie

0dxa2lsx  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(152)

我是一个学习Servlet的新手。当我在Servlet中使用cookie时,我发现在访问网页后cookie不能被添加。下面是我的代码:

import jakarta.servlet.ServletException;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;

public class LastAccessServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String lastAccessTime = null;
        Cookie[] cookies = req.getCookies();
        PrintWriter writer = resp.getWriter();
        for (int i = 0; cookies != null && i < cookies.length; ++i){
            if ("lastAccess".equals(cookies[i].getName())) {
                lastAccessTime = cookies[i].getValue();
                break;
            }
        }
        if (lastAccessTime == null){
            writer.println("Your first visit.");
        } else {
            writer.println("Last time" + lastAccessTime);
        }
        String currentTime = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date());
        Cookie cookie = new Cookie("lastAccess", currentTime);
        cookie.setMaxAge(999999999);
        cookie.setPath("/");
        resp.addCookie(cookie);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}

这是我的网页:

不管我刷新、重新加载或更改浏览器多少次,结果都是一样的。
我在我的边缘浏览器中检查cookie。

cookie没有我添加的值名lastAccess,所以我认为问题出在resp.addCookie(cookie);。但不知道如何解决。

e4eetjau

e4eetjau1#

您的问题实际上不是代码/逻辑,而是这里的数据。您正在尝试设置一个cookie值,它更像一个日期字符串,看起来像2022-10-01 03:01:22这里的cookie值是非法的。根据RFC6265,您不允许在cookie中使用某些特殊字符。更详细的描述可在此answer中找到
你可以通过改变cookie值的形式来解决这个问题。例如,用时间戳代替日期字符串。如下所示。

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        resp.setContentType("text/html;charset=utf-8");
        String lastAccessTime = null;
        Cookie[] cookies = req.getCookies();
        PrintWriter writer = resp.getWriter();
        for (int i = 0; cookies != null && i < cookies.length; ++i){
            if ("lastAccess".equals(cookies[i].getName())) {
                lastAccessTime = cookies[i].getValue();
                break;
            }
        }
        if (lastAccessTime == null){
            writer.println("Your first visit.");
        } else {
            writer.println("Last time" + new Date(Long.parseLong(lastAccessTime)));
        }
        String currentTime = String.valueOf( new Date().getTime());
        Cookie cookie = new Cookie("lastAccess", currentTime);
        cookie.setMaxAge(999999999);
        cookie.setPath("/");
        resp.addCookie(cookie);
    }

相关问题