2012-09-02 33 views
1

在我的Web應用程序中,我使用JQuery中的​​函數在DIV中加載一些JSP頁面。如何防止客戶端訪問JSP頁面

$("#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來訪問此頁面,因爲它看起來很糟糕,而主頁面中的其他內容不會在那裏,這可能會損害網絡應用安全。

如何限制某人直接訪問chat.jsp,但通過​​保持訪問?

UPDATE:

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> 

傢伙,我不知道是什麼意思篩選。

UPDATE

如果我決定送,告訴我,這要求從jQuery的傳來的參數。

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

然後將其簽入chat.jsp

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

然後,他們可以通過簡單地使用這個網址破解這個。

/chat.jsp?jquery=yes 

或類似的東西..

UPDATE

我試圖馬克西姆的建議下,我得到這個,當我試圖訪問chat.jsp。

enter image description here

這是預期的效果?

+1

我更新了我的答案。 –

回答

2

爲了在我的應用程序中實現這一點,我檢查了http頭中的X-Requested-With字段,客戶端發送給我的頁面請求。如果它的值是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")){ 
    ... 
} 
+1

+1我認爲這是一個有效的答案 – MaVRoSCy

+0

你們可以請檢查我上面添加的代碼並幫助我製作此答案的JSP版本嗎? –

+1

@AliBassam在檢查用戶會話和數據庫查詢之前添加我提供的代碼。 –

1

你的代碼片段是一個servlet嗎?如果是這樣,請使用安全框架(如Spring Security)或javax.servlet.Filter來應用安全性,然後您也可以將安全性應用於JSP。

+0

是它的一個片段<% %> –

+1

你能提供帶有過濾器的示例代碼嗎? – MaVRoSCy

+0

@MaVRoSCy我添加了代碼 –

1

您應該使用過濾器。檢查過濾器代碼中的會話並重定向到登錄。

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"); 
    }, 
........... 

然後在你的servlet檢查,看是否要求有頭管理局等於AJAXREQUEST。這是你如何閱讀請求標題http://www.apl.jhu.edu/~hall/java/Servlet-Tutorial/Servlet-Tutorial-Request-Headers.html