Почему мой Java HttpServlet не может найти значение моего cookie? - PullRequest
0 голосов
/ 10 октября 2010

Я создал два сервлета:

UserReceiverServlet получает имя пользователя из формы. Затем он устанавливает имя пользователя в атрибут и перенаправляет запрос в UserDisplayServlet.

UserDisplayServlet добавит имя пользователя в файл cookie и затем отобразит текущие континенты как атрибута, который был установлен, так и файла cookie, который был сохранен.

Однако, хотя мне удалось определить, что файл cookie определенно создается и значение сохраняется, когда этот сервлет отправляется на его поиск, он не находит его

Вот UserDisplayServlet. Он правильно получает значение через request.getAttribute ("username"), поэтому attributeUsername не является проблемой ...

/**
 * 
 */
package hu.flux.user;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.http.*;

/**
 * @author Brian Kessler
 *
 */
public class UserDisplayServlet extends HttpServlet {

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void service (HttpServletRequest request, HttpServletResponse response)
    {
        response.setContentType("text/html");

        String attributeUsername = (String) request.getAttribute("username"); 

        String cookieUsername = null;
    for (Cookie cookie: request.getCookies())
        { if (cookie.getName() == "username") 
            { 
                String value = cookie.getValue();
                if (value.isEmpty()) { value = "--- EMPTY ---"; }
                cookieUsername = cookie.getValue(); 
                break; 
            } 
        }
    if (cookieUsername == null) {cookieUsername = "--- NOT FOUND ---"; }

    String newCookieValue;
    if (!(cookieUsername.isEmpty())) { newCookieValue = cookieUsername;}
    else if (!(attributeUsername.isEmpty())) { newCookieValue = cookieUsername;}
    else { newCookieValue = "UNKOWN";}

        Cookie usernameCookie = new Cookie ("username", attributeUsername);
        usernameCookie.setMaxAge(24*60*60);
        response.addCookie(usernameCookie);

        PrintWriter out = null;
        try { out = response.getWriter(); } 
        catch (IOException e) 
        { 
            System.err.print ("Cannot getWriter():" + e);
            e.printStackTrace();
        }


        out.println("<html>");
        out.println("<head>");
            out.println("<title>User Display Servlet</title>");
        out.println("</head>");
        out.println("<body");

        if ((attributeUsername != null) && (!(attributeUsername.isEmpty())))
        {
            out.println ("<p>I have an attribute which says your username is " 
                    + request.getAttribute("username") + "</p>");
        }
        else { out.println ("<p>The attribute hasn't been set.</p>"); }


        if ((cookieUsername != null) && (!(cookieUsername.isEmpty())))
        {
            out.println ("<p>You have a cookie which says your username is " + cookieUsername + "</p>");
            out.println ("</body></html>");
        }
        else { out.println ("<p>The cookie hasn't been set.</p>"); }


    }


}

Если это полезно, вот сервлет, который получает входные данные и перенаправляет их на вышеуказанный сервлет:

/**
 * 
 */
package hu.flux.user;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.*;

/**
 * This simple servlet receives a username from a form,
 * stores the name in a context attribute,
 * and forwards the context attribute to another servlet
 * which displays the name.
 *  
 * @author Brian Kessler
 *
 */
public class UserReceiverServlet extends HttpServlet 
{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    public void service (HttpServletRequest request, HttpServletResponse response)
    {
        String username = request.getParameter("username");
        request.setAttribute("username", username);

        try {

            getServletConfig()
                .getServletContext()
                .getRequestDispatcher("/userdisplay")
                .forward(request, response);
        } catch (ServletException e) {
            System.err.println ("Can't forward: " + e);
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println ("Can't forward: " + e);
            e.printStackTrace();
        }


    }
}

Чего мне не хватает, чтобы получить значение, сохраненное в куки?

Ответы [ 2 ]

1 голос
/ 10 октября 2010

Нашел проблему:

if (cookie.getName() == "username") 

должно было быть:

if (name.equals("username")) 

Это всегда сбивает меня с толку!

0 голосов
/ 10 октября 2010

Откуда вы знаете, что cookie не был установлен?Тело HTML точно не скажет вам, потому что контент оценивается на стороне сервера, а не на стороне клиента.Если вы действительно хотите, чтобы страница сообщала вам, успешно ли был установлен файл cookie, вам потребуется встроить некоторый JavaScript в HTML, чтобы получить доступ к хранилищу файлов cookie браузера.

Если я пытался решить эту проблему,Я бы начал с просмотра HTTP-ответов на стороне сервера и клиента.На стороне сервера включите дамп / запись ответов, поддерживаемую вашим контейнером веб-приложений;Например, для Tomcat включите RequestDumperValve.На стороне клиента используйте диалоги настроек браузера (или что-то еще), чтобы просмотреть содержимое хранилища cookie для сервера, с которым вы взаимодействуете.Затем используйте отладчик Javascript браузера (или любой другой), чтобы увидеть, содержат ли заголовки ответа заголовки для установки файлов cookie.(Если вы используете Firefox, установите плагин Firebug.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...