2

ここに初めて投稿するときは、それが有効な質問であることを願っています。私は、ページ上のフォームから3つの名前/値ペアを受け入れ、それらを1.リクエスト属性2.セッション属性および3.Cookie属性として設定する基本的なJavaサーブレットを構築してきました。次に、Cookieが応答に追加され、ビュー(AccountSettings.jsp)が転送されます。次に、AccountSettingsページはrequest.getCookies()を使用してそれらを配列にダンプし、配列から値を読み取ることになっています。このすべては、私がこのフォームを使用するたびに発生することになっています。

私の問題は、Cookieの値が正しいのは、最初にフォームを使用したときだけであり、その後、フォームを再度使用するたびに、ページの読み込み時に入力された最後の値がCookieに表示されることです。ただし、ページを更新すると、Cookieの値は正しく表示されます。ログアウトサーブレットでCookieを手動で削除しようとしましたが(setMaxAge(0)を実行してから応答に再追加)、インデックス1で定数ArrayOutOfBoundsExceptionしか生成されなかったため、その部分をコメントアウトしてCookieをそのままにしました。

ページが表示された後、Chromeでlocalhostに関連付けられたCookieを確認しましたが、値が正しく設定されているため、Cookieが実際に正しく設定される前にJSPが描画されているように見えます。

これを修正する方法についての助けをいただければ幸いです。これが私のコードです。

サーブレット:

public class Login extends HttpServlet {
private static final long serialVersionUID = 1L;

public Login() {

    super();

}

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    login(request, response);

}


protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    login(request, response);

}


private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

    // get a new or existing session
    HttpSession session = request.getSession();

    // Instantiate user and populate values
    User user = new User();
    user.setUser(request.getParameter("user"));
    user.setPass(request.getParameter("pass"));

    // Get last page
    String referringUrl = request.getParameter("referringPage");

    session.setAttribute("user", user.getUser());
    session.setAttribute("pass", user.getPass());
    session.setAttribute("lastPage", referringUrl);

    Cookie cookie1 = new Cookie("user", user.getUser());
    Cookie cookie2 = new Cookie("pass", user.getPass());
    Cookie cookie3 = new Cookie("lastPage", referringUrl);

    response.addCookie(cookie1);
    response.addCookie(cookie2);
    response.addCookie(cookie3);

    request.setAttribute("user", user.getUser());
    request.setAttribute("pass", user.getPass());
    request.setAttribute("lastPage", referringUrl);

    try{

        if (user.authorize()){

            session.setAttribute("name", user.getName());
            session.setAttribute("authorized", "1");

        }else{

            session.setAttribute("authorized", "0");

        }
    }
    catch(Exception e){
        e.printStackTrace();
    }

    RequestDispatcher view = request.getRequestDispatcher("AccountSettings.jsp");
    view.forward(request, response);

    user.destroy();

}

}

意見:

<div id="content">
        <div class="padding">

            <%
                if (!loggedIn){
                    out.print(
                        "Oops! I'm not sure how you got here..."
                    );
                }else{
                    Cookie[] cookies = request.getCookies();

                    out.print(
                        "<h2>Account Settings</h2><br><br>" +
                        "<table>" +
                            "<tr>" +
                                "<th>Source</th>" +
                                "<th>Username</th>" +
                                "<th>Password</th>" +
                                "<th>Last Page Visted</th>" +
                            "</tr>" +
                            "<tr>" +
                                "<th>Request</th>" +
                                "<td>" + request.getAttribute("user") + "</td>" +
                                "<td>" + request.getAttribute("pass") + "</td>" +
                                "<td>" + request.getAttribute("lastPage") + "</td>" +
                            "</tr>" +
                            "<tr>" +
                                "<th>Session</th>" +
                                "<td>" + session.getAttribute("user") + "</td>" +
                                "<td>" + session.getAttribute("pass") + "</td>" +
                                "<td>" + session.getAttribute("lastPage") + "</td>" +
                            "</tr>" +
                            "<tr>" +
                                "<th>Cookies</th>" +
                                "<td>" + cookies[1].getValue() + "</td>" +
                                "<td>" + cookies[2].getValue() + "</td>" +
                                "<td>" + cookies[3].getValue() + "</td>" +
                            "</tr>" +
                        "</table>"
                    );

                }
            %>

        </div>
    </div>
4

1 に答える 1

3

そのため、Cookieが実際に正しく設定される前にJSPが描画されるように見えます

そのとおりです。応答に新しいCookieを追加していますが(したがって、同じドメインとパスの後続のリクエストでのみ使用可能です)、JSPは現在のリクエストからCookieを読み取ろうとしています。

置き換えることにより、転送ではなくリダイレ​​クトを送信する必要があります

RequestDispatcher view = request.getRequestDispatcher("AccountSettings.jsp");
view.forward(request, response);

response.sendRedirect("AccountSettings.jsp");

または、Cookie値をリクエスト属性としてコピーして、JSPがそれらをリクエスト属性として取得できるようにします(これを行う方法はすでに知っています)。


具体的な問題とは関係なく、Cookieでパスワードを渡すことは非常に悪い考えです。それは大きなセキュリティホールです。具体的な機能要件については、代わりに、ログインしたユーザーをセッション属性として保存することをお勧めします。

于 2012-10-19T14:15:51.730 に答える