2010-06-02 86 views
2

如何阻止JSP執行?Java:JSP在頁面的其餘部分暫停執行

我有JSP通過「轉發」方式將用戶踢出頁面。

public boolean kickIfNotLoggedIn(
     HttpServletRequest request, HttpServletResponse response) 
     throws IOException, ServletException { 
    //code to check if user is logged in 
    req.getRequestDispatcher(
      ACCESS_DENIED_PAGE).forward(request, response); 
} 

在我的JSP中,我有這樣的代碼,在任何HTML輸出:

<% 
      //loginHelper.kickIfNotLoggedIn(request, response); 
      if (!loginHelper.kickIfNotLoggedIn(request, response)) { 
       return; 
      } 
%> 

如果我不使用return語句時,JSP繼續處理,我也得到一個NullPointerException。如果我使用return語句(如在在網上各種來源通常建議),我得到一個IllegalStateException:

StandardWrapperValve[jsp]: PWC1406: Servlet.service() for servlet jsp threw exception 
java.lang.IllegalStateException: PWC3991: getOutputStream() has already been called for this response 
     at org.apache.coyote.tomcat5.CoyoteResponse.getWriter(CoyoteResponse.java:717) 
     at org.apache.coyote.tomcat5.CoyoteResponseFacade.getWriter(CoyoteResponseFacade.java:226) 
     at org.apache.jasper.runtime.JspWriterImpl.initOut(JspWriterImpl.java:187) 

任何想法如何解決這個問題,或者另一種方式來實現訪問被拒絕的頁面?

謝謝

回答

2

你不能這樣做。該錯誤消息有點不清楚,但它與在一個資源中開始呈現響應,停止,然後轉發到另一個嘗試重新啓動HTTP響應處理的資源有關。

改爲在所有需要登錄的JSP之前使用servlet Filter在任何JSP甚至觸及響應之前重定向。

+0

感謝您的回答,您是否可以指示我如何爲我的JSP創建Servlet過濾器?非常感激。 – bguiz 2010-06-02 11:08:09

+1

@bguiz:http://courses.coreservlets.com/Course-Materials/msajsp.html – BalusC 2010-06-02 11:41:46

+0

@BalusC:謝謝,這是一套非常好的文章鏈接! – bguiz 2010-06-02 12:27:26

1

用途:

req.getRequestDispatcher(ACCESS_DENIED_PAGE).redirect(request, response); 

確保您的調用檢查權限是在頁面的第一件事情,以避免錯誤消息。

「正確」的方式當然是一個過濾器,但它可能會涉及到你所需要的。在任何情況下,看這裏:

http://java.sun.com/products/servlet/Filters.html 
0

一個關於JSP討厭的一點就是任何空間將導致的OutputStream要獲取(至少在Tomcat中)。因此,例如下面的代碼將失敗:

<%@ page import="javax.servlet.ServletOutputStream" %> 

<% 
    //note the blank line above^ 
    ServletOutputStream out = response.getOutputStream(); 
    //write some data... 
%> 

爲進口和代碼塊之間的空行被Tomcat認爲是輸出的一部分,所以它會得到作家和輸出兩條新線。因此,爲了工作,你需要確保有代碼中沒有多餘的字符:

<%@ page import="javax.servlet.ServletOutputStream" %><% 
    //no blank line, this will work OK 
    ServletOutputStream out = response.getOutputStream(); 
    //write some data... 
%> 

現在有代碼塊之間沒有字符,以便tomcat會不會嘗試生成輸出。我的猜測是這是你例外的原因。這就是說這是一個更快更骯髒的解決方案,類似於肖恩所建議的可能是更合適的解決方案。

+0

這並不煩人。這只是濫用JSP。 JSP是一種視圖技術,而不是控制器或過濾器。 – BalusC 2010-06-02 11:40:31

相關問題