【问题标题】:getCookies() gets both the cookies and the sessiongetCookies() 获取 cookie 和会话
【发布时间】:2015-02-20 15:05:25
【问题描述】:

我有两个 servlet,另一个 servlet 应该从 cookie 和会话中输出信息(我们教授的指令)。问题是,我尝试使用 getCookies() 从请求对象中获取 cookie,但它返回两个对象,第一个对象名称为“JSESSIONID”及其随附的十六进制代码,第二个对象包含我创建的 cookie。为什么会这样? getCookie() 如何只返回 cookie?

代码如下:

小服务程序 1:

package com.telco.process;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
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;
import javax.servlet.http.HttpSession;

/**
 * Servlet implementation class ConvertServlet
 */
@WebServlet("/Convert")
public class ConvertServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private String num;
    private String telco;
    private HttpSession session;
    private RequestDispatcher rd;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {
        String convertedNum = "";
        session = request.getSession();
        num = request.getParameter("number");
        telco = request.getParameter("telco");
        rd = request.getRequestDispatcher("Display");

        Cookie cTelco = new Cookie("telco", telco);
        if (!(num.equals(null)) || !(num.equals("")))
        {
            for (byte i = 0; i < num.length(); i++)
            {
                switch(num.charAt(i))
                {
                    case 'A':
                    case 'B':
                    case 'C': convertedNum += "2"; break;
                    case 'D': 
                    case 'E':
                    case 'F': convertedNum += "3"; break;
                    case 'G':
                    case 'H': 
                    case 'I': convertedNum += "4"; break;
                    case 'J':
                    case 'K':
                    case 'L': convertedNum += "5"; break;
                    case 'M':
                    case 'N':
                    case 'O': convertedNum += "6"; break;
                    case 'P':
                    case 'Q':
                    case 'R':
                    case 'S': convertedNum += "7"; break;
                    case 'T':
                    case 'U':
                    case 'V': convertedNum += "8"; break;
                    case 'W':
                    case 'X':
                    case 'Y':
                    case 'Z': convertedNum += "9"; break;
                }
            }
            session.setAttribute("number", convertedNum);
            response.addCookie(cTelco);
        }
        rd.forward(request, response);
    }

}

小服务程序 2:

package com.telco.process;

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;
import javax.servlet.http.HttpSession;

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

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter pw = response.getWriter();
        Cookie ck[] = request.getCookies();
        System.out.println(ck[0].getValue());
        pw.println("The converted number is " + "-" + request.getSession(false).getAttribute("number"));    
    }
}

【问题讨论】:

    标签: java session servlets cookies


    【解决方案1】:

    JSESSIONID 确实是一个cookie,它是用来标识会话的。在服务器上创建一个带有 ID 的会话。服务器将带有 ID 的 cookie 发送到浏览器 (JSESSIONID)。然后,浏览器会在每次请求时将此 JSESSIONID cookie 发送到服务器,服务器使用它来将请求映射到会话。

    编辑:查找 cookie 的一些示例代码:

    您应该仅通过名称访问您的 cookie,而不是通过索引。这是一个示例帮助程序,您可以这样使用它(当然,在实际程序中检查null):

    System.out.println(getCookieByName(request, "telco").getValue());
    
    
    /**
     * Find a specific HTTP cookie in a request.
     * 
     * @param request
     *            The HTTP request object.
     * @param name
     *            The cookie name to look for.
     * @return The cookie, or <code>null</code> if not found.
     */
    protected Cookie getCookieByName(HttpServletRequest request, String name) {
        if (request.getCookies() == null) {
            return null;
        }
        for (int i = 0; i < request.getCookies().length; i++) {
            if (request.getCookies()[i].getName().equals(name)) {
                return request.getCookies()[i];
            }
        }
        return null;
    }
    

    【讨论】:

    • 那么我如何访问我的其他 cookie?通过增加 cookie 数组索引? JSESSIONID 还会出现在其他计算机中吗?因为在其他示例中,他们只使用索引 0 来访问他们的 cookie。
    • 你不能假设你的cookie总是在发送的所有cookie的某个索引位置。我通常有一个例程 Cookie getCookieByName(HttpServletRequest request, String name) 遍历所有 cookie 并返回具有请求名称的 cookie。
    • 哦。我不知道有这样的方法。谢谢。
    • 没有,我在答案中添加了一些示例代码
    猜你喜欢
    • 2012-04-22
    • 2011-05-17
    • 2011-04-20
    • 2017-03-14
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 2011-02-23
    相关资源
    最近更新 更多