0

編集:

オンラインでリソースを見つけることができないようで、初めて説明するのにひどい仕事をしたので、この説明を馬鹿にしようとします. 私の目標は何ですか:

任意の JSP から開始します (ユーザーがサイト内でアクセスできる場所ならどこでもかまいません) が、議論のためにindex.jsp. ユーザーがログインが必要な操作を行おうとすると、 という別のページでその操作を行うように求められますlogin.jsp。ここで、ユーザーは認証サーブレットに送信されるフォームを送信してログオンし、元の場所にリダイレクトされますが、この例ではindex.jsp. 以下に、これまでに行ったことを説明します。私はセッションを試しましたが、それを介してURLを送信しない原因となったこの奇妙な風変わりな動作があります。また、GET を介して URL を追加したくありません。追加すると表示され、見苦しくなるからです。そのロジックをユーザーから隠しながらこれを行うことは可能ですか?


これまでに試したことは、ページがユーザーにログインを指示するときはいつでも、URL を追加してAuthenticate.javaサーブレットに送信することです。doGet()そこで、ログインにリダイレクトする を呼び出すためlogin.jsprequest変数から my にアクセスできます。問題は、URL が指しているのではなくlogin.jsp、私の認証サーブレットと追加された URL を指していることです。したがって、次のようになります。

http://localhost:8080/app/login 

しかし、それは言います

http://localhost:8080/app/authenticate?url=/index.jsp

もう少し理にかなっているように、コードを提供します。説明が必要な場合は、お気軽にお尋ねください。ありがとう。

アップデート:

わかりました、更新する必要があるようです/ Hardik Mishra の懸念に対処するために、リダイレクトを行ったことをお詫びします。私へのリダイレクトは、コントローラーであるため、別のページに指示することで情報を渡すことを意味する可能性があるため、一般的/大まかにこの用語を使用しました。ご覧のとおり、私は明らかにを使用していRequestDispatcherます。私はドキュメントを読むのに十分な能力があるので、応答にはsendRedirect()使用できる方法があることがわかります。しかし、上で述べたように、上記の理由からセッションを使用したくありません。sendRedirect()同じに保たないrequest私は情報を失う。しかし、私がそれらの URL を取得した場所についても混乱していたので、JSP を呼び出すサンプルを提供します。これを含めなかった理由は、ユーザーがログインを求められる前に対話していた JSP に関係なく、ユーザーを常に元の場所に戻すことが重要だからです。私の場合に使用していたJSPの例はAuth.java、わかりやすくするために上に追加されています。また、私が時期尚早に追加したようで、それが混乱を助長した可能性があるため、再度お詫び申し上げますisLoggedIn()AuthUtilities

index.jsp


<%@ page import="com.myapp.app.AuthUtilities, com.myapp.app.Dbase" %>

<html>
<head>

    <title>Home</title>
</head>
<body>
    <h3><%= AuthUtilities.isLoggedIn(session, request) %></h3>
    <CENTER>
    <h2>Welcome to UniHub! <%= request.getServletPath() %></h2>

    <form ACTION="le_test" METHOD="POST">
        <input TYPE="text" name="query">
        <input TYPE="submit" value="Search"><br>
    </form>
    </CENTER>
    <hr>
    <a href = "home">home</a>
</body>

</html>

Auth.java


@WebServlet("/authenticate")
public class Auth extends HttpServlet {
@Override
public void doPost(HttpServletRequest req, 
    HttpServletResponse res) throws ServletException, IOException {

    String servletPath = (req.getAttribute("url") != null) ?
        ((String)req.getAttribute("url")).replaceFirst("/", "") : "home";

    if(AuthUtilities.authenticate(userName, password)) {
        res.sendRedirect(servletPath);
    }
    else
        res.sendRedirect("login");

}//end of doPost method

public void doGet(HttpServletRequest req,
    HttpServletResponse res) throws ServletException, IOException {

    RequestDispatcher dis = req.getRequestDispatcher("login");
    dis.forward(req, res);

}//end of doGet method

}//end class

login.jsp


    <%@ page import="com.myapp.app.AuthUtilities" %>

<!doctype html>
<html>

<head>
    <title>Login</title>
</head>

<body>

    <form action="authenticate" method="POST">
        <label for="username">Username</label>
        <input type="text" name="username"><br>
        <label for="password">Password</label>
        <input type="password" name="password"><br>

        <% if(request.getAttribute("url") != null) { %>
            <input type="hidden" value="<%= request.getAttribute("url") %>" name="url"><br>
        <% } %>

        <input type="submit" value="login">
    </form>
        <p>Not a member? <a href="signup">Sign Up Now</a></p>
</body>

</html>

isLoggedIn() メソッド


public static String isLoggedIn(HttpSession session, HttpServletRequest req) {
        String userName = (String)session.getAttribute("username");
            if(userName != null)
                userName = "You are logged in as <a href='profile'>"+
                    userName + "</a> | " +
                    "<a href='logout'>Logout :(</a>";
            else
                userName = "<a href=\"authenticate?url="+req.getServletPath()+"\">Login</a>";

            return userName;
    }
4

2 に答える 2

2

まず第一に、あなたは質問を明確に説明していません。Auth私が持っているサーブレットから

http://localhost:8080/app/login 

しかし、それは言います

http://localhost:8080/app/authenticate?url=/index.jsp

成功すると目的のページにリダイレクトされ(有効な資格情報)、無効な場合はリダイレクトを使用して「login.jsp」にリダイレクトされdoPost()ます。

これまで試したことは、ページがユーザーにログインを指示するときはいつでも、URL を追加して Authenticate.java サーブレットに送信することです。そこで、ログインにリダイレクトする doGet() を呼び出すため、リクエスト変数から login.jsp にアクセスできます。問題は、URL が login.jsp を指しているのではなく、認証サーブレットと追加された URL を指していることです。

ではdoGet()、ログイン ページにリダイレクトするのではなく、ページを転送します。( Jsp 転送とリダイレクトの違いを参照してください)。

したがって、あなたの場合、ブラウザの URL は更新されず、リクエスト オブジェクトの属性にもアクセスできます。したがって、値を に格納しHttpSession、 で使用response.sendRedirectdoGet()ます。

JSP ページを取得するためにリクエスト ヘッダーから使用する別の方法request.getHeader("Referer")ですが、リファラーの送信がファイアウォールまたはブラウザーの構成によってブロックされる可能性があるため、お勧めできません。

于 2013-03-05T10:45:26.097 に答える
0

にリダイレクトするだけでなくlogin、ログインが成功した場合にリダイレクトする必要がある URL を示す「refererurl」などの追加パラメーターを渡すことができます。

  @Override
    public void doPost(HttpServletRequest req, 
        HttpServletResponse res) throws ServletException, IOException {

        String urlToRedirectAfterLogin = req.getParameter('refererurl');

        String servletPath = (req.getAttribute("url") != null) ?
            ((String)req.getAttribute("url")).replaceFirst("/", "") : "home";

        if(AuthUtilities.authenticate(userName, password)) {
            res.sendRedirect(urlToRedirectAfterLogin);
        }
        else{
            String fullURL = request.getRequestURL().append("?")
.append(request.getQueryString()).toString();
        res.sendRedirect("login"+"?refererurl="+fullURL);

            }

    }//
于 2013-03-05T10:45:05.810 に答える