getCookies() 获取 cookie 和会话
getCookies() gets both the cookies and the session
我有两个 servlet,另一个 servlet 应该从 cookie 和会话(我们教授的说明)输出信息。问题是,我尝试使用 getCookies() 从请求对象中获取 cookie,但它 return 有两个对象,第一个对象的名称为 "JSESSIONID" 及其附带的十六进制代码,第二个对象包含我创建的 cookie。为什么会这样? getCookie() 怎么会只有 return 个 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"));
}
}
JSESSIONID确实是一个cookie,它是用来标识session的。使用 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;
}
我有两个 servlet,另一个 servlet 应该从 cookie 和会话(我们教授的说明)输出信息。问题是,我尝试使用 getCookies() 从请求对象中获取 cookie,但它 return 有两个对象,第一个对象的名称为 "JSESSIONID" 及其附带的十六进制代码,第二个对象包含我创建的 cookie。为什么会这样? getCookie() 怎么会只有 return 个 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"));
}
}
JSESSIONID确实是一个cookie,它是用来标识session的。使用 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;
}