1

私の Web アプリケーションでは.load()、JQuery の関数を使用しJSPて、DIV.

$("#myDiv").load("chat.jsp");

ではchat.jsp、このクライアントがログインしていない限り、Java コードは実行されません。つまり、セッションをチェックします。

String sessionId = session.getAttribute("SessionId");
if(sessionId.equals("100")){
  //execute codes
}else{
  //redirect to log in page
}

実行されるこれらの Java コードは、out.println();いくつかの HTML 要素になります。

クライアントがこのページにアクセスするためにブラウザーに書き込むことは望ましくありません。/chat.jsp見栄えが悪く、メインページの他のものが表示されず、Web アプリのセキュリティに害を及ぼす可能性があるからです。

chat.jsp誰かが直接アクセスできないように制限しながら、経由でアクセスできるようにするにはどうすればよい.load()ですか?

アップデート:

JavaDB は私が作成したクラスで、データベースに接続します。

これはchat.jspです

<body>

    <%

        String userId = session.getAttribute("SessionId").toString();
        if (userId != null) {
            String roomId = request.getParameter("roomId");
            String lastMessageId = request.getParameter("lastMessageId");
            JavaDB myJavaDB = new JavaDB();
            myJavaDB.Connect("Chat", "chat", "chat");
            Connection conn = myJavaDB.getMyConnection();
            Statement stmt = conn.createStatement();
            String lastId = "";
            int fi = 0;
            ResultSet rset = stmt.executeQuery("select message,message_id,first_name,last_name from users u,messages m where u.user_id=m.user_id and m.message_id>" + lastMessageId + " and room_id=" + roomId + " order by m.message_id asc");
            while (rset.next()) {
                fi = 1;
                lastId = rset.getString(2);
    %>
    <div class="message">
        <div class="messageSender">
            <%=rset.getString(3) + " " + rset.getString(4)%>
        </div>
        <div class="messageContents">
            <%=rset.getString(1)%>
        </div>
    </div>
    <%            }
    %>
    <div class="lastId">
        <% if (fi == 1) {%>
        <%=lastId%>
        <% } else {%>
        <%=lastMessageId%>
        <% }%></div>

    <% if (fi == 1) {%>
    <div class="messages">
    </div> 
    <% }
        } else {
            response.sendRedirect("index.jsp");
        }%>
</body>

フィルタの意味がわかりません。

アップデート

このリクエストが Jquery からのものであることを示すパラメーターを送信することにしたとします。

.load("chat.jsp", { jquery : "yes" });

そして、chat.jsp で確認します。

String yesOrNo = request.getParameter("jquery");

次に、この URL を使用して簡単にハッキングできます。

/chat.jsp?jquery=yes

またはそのようなもの..

アップデート

Maksim のアドバイスを試してみたところ、chat.jsp にアクセスしようとしたときにこれが表示されました。

ここに画像の説明を入力

これは望ましい効果ですか?

4

4 に答える 4

2

X-Requested-Withアプリケーションでこれを実現するために、クライアントがリクエストでページに送信する http ヘッダーのフィールドをチェックします。その値が の場合XMLHttpRequest、それは ajax リクエスト (jQuery はこのヘッダーをそのリクエストに追加します) からのものである可能性が非常に高く、それ以外の場合はページを提供しません。通常の (直接の) ブラウザー リクエストでは、このヘッダー フィールドは空白のままになります。

ASP.Net では次のようになります。JSP 用にコードを少し変更する必要があります。

if (Request.Headers["X-Requested-With"] != "XMLHttpRequest")
{
     Response.Write("AJAX Request only.");
     Response.End();
     return;
}

UPD :簡単にグーグル検索した後、コードはおそらく次のようになります

if(!request.getHeader("X-Requested-With").equals("XMLHttpRequest")){
    out.println("AJAX Request only.");
    out.flush(); 
    out.close(); 
    return; 
}

UPD2 :request.getHeader("X-Requested-With")あなたのケースでは null を返すように見えますが、条件を次のように変更します。

String ajaxRequest = request.getHeader("X-Requested-With");
if(ajaxRequest == null || !ajaxRequest.equals("XMLHttpRequest")){
    ...
}
于 2012-09-02T09:07:18.173 に答える
1

フィルターを使用する必要があります。フィルター コードでセッションを確認し、ログインにリダイレクトします。

于 2012-09-02T09:09:01.467 に答える
1

http://www.c-sharpcorner.com/blogs/2918/how-to-set-a-request-header-in-a-jquery-ajax-call.aspxによると

JQuery は、リクエストを作成し、その ajax ライブラリを介してレスポンスを取得するために必要なツールを提供します。生の $.ajax 呼び出しは、http メッセージを操作するためのあらゆる種類のコールバックを提供します。

したがって、次のように Ajaxa 呼び出しにカスタム リクエスト ヘッダーを追加できます。

$.ajax({
  type:"POST",
  beforeSend: function (request)
  {
     request.setRequestHeader("Authority", "AJAXREQUEST");
  },
...........

次に、サーブレットで、リクエストのヘッダー Authority が AJAXREQUEST に等しいかどうかを確認します。これは、リクエストヘッダーを読み取る方法ですhttp://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Request-Headers.html

于 2012-09-02T09:17:13.487 に答える
1

コード スニペットはサーブレットですか? その場合は、セキュリティ フレームワーク (Spring Security など) または javax.servlet.Filter を使用してセキュリティを適用すると、JSP にもセキュリティを適用できます。

于 2012-09-02T08:58:10.223 に答える