2012-04-30 92 views
0

我正在使用servlet構建一個簡單的WebApplication。我是一名初學者,但已經試圖學習這項技術的大部分。有什麼我不明白。我的一個的servlet是有用BalusC FileServlet如何讓Servlet識別調用者JSP和會話

http://balusc.blogspot.mx/2007/07/fileservlet.html 

它響應要獲得所需要的文件,非常乾淨的請求。

我用這個FileServlet服務CSV文件的Dygraph

http://dygraphs.com/ 

我有兩種類型的用戶:來賓和管理員。客人應該能夠看到圖表但不能下載CSV文件。管理員應該能夠做到這一點。

fileServlet對URL模式的響應如下:file/*(*是文件名),它非常方便,因爲Dygraph讀取URL中指定的文件。

在這個webapp中有一個loginServlet,我希望能夠避免fileservlet給出文件,如果用戶只是複製粘貼給Dygraph的URL。 FileServlet已經能夠從該會話中獲取會話和loggeduser,但我不知道如何檢測到什麼是調用GET方法的頁面。我希望fileservlet只在JSP代碼中調用時才提供文件,而不是從瀏覽器的地址欄中調用。

讓我解釋一下:

我的意思是 - 作爲一個來賓用戶下面的JavaScript代碼應顯示圖形(該FileServlet提供文件)

<div id="graphdiv2" style="width:640px; height:480px;"> 
<script type="text/javascript"> 
g2 = new Dygraph(
document.getElementById("graphdiv2"), 
"${messages.rutacsv}", // path to CSV file 
{ 
rollPeriod: 10, 
showRoller: true 
} 
); 
</script>    
</div> 

變量: 「$ {} messages.rutacsv」被由servlet替代的東西,看起來像這樣:

「文件/ 2012-04-20_1.csv」

因此T他Dygraph很好地加載文件並繪製線條。

但是,我希望FileServlet能夠檢測到用戶在ContextName後複製此URL並將其阻止,因此只有Dygraph可以下載該文件。

例如,如果在其瀏覽器的用戶類型:

http://localhost:8080/MyWebApp/file/2012-04-20_1.csv 

應該無法下載。只有管​​理員應該能夠。

現在,我想我應該實現FileServlet,因此必須使用另一個URL模式或使用POST方法調用,以便簡單的用戶副本 - 麪食無法越過「原始JSP」檢查。

順便說一句,我回來嘗試使用Struts2,這對於這個應用來說太複雜了。爲了方便和簡單的servlet和JSP,我放棄了它。

+0

看起來像你需要的是Servlet過濾器,它檢查URL和當前用戶角色,並允許直接下載管理員。對於其他請求只返回404或發送重定向到JSP。 –

+0

好的,但我不認爲我已經實現了用戶角色。我只在會話上執行session.setAttribute(「logonuser」,「用戶名」)。我想我必須做更多的工作......不是嗎? –

+0

這取決於你的要求。如果任何登錄用戶可以直接下載,那麼你可以檢查會話中是否存在'logonuser'屬性,否則重定向到登錄servlet。 –

回答

2

使用filter來檢查用戶角色。也就是說,在任何重要的行動之前,檢查用戶是否有權採取這一行動。這是任務servlet過濾器。

您必須擴展javax.servlet.Filter類實現方法doFilter()如下:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest req = (HttpServletRequest) request; 

    HttpSession session = req.getSession(); 

    String currentRole = (String) session.getAttribute("userRole"); 

    if ("admin".equals(currentRole)) { 
     successRedirect(); 
    } else { 
     failRedirect(); 
    } 
    chain.doFilter(request, response); 
} 

而且不要忘記這個過濾器映射到web.xml文件中所需的地址:

<filter> 
    <filter-name>CheckRightAccessFilter</filter-name> 
    <filter-class>yourproject.CheckRightAccessFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>CheckRightAccessFilter</filter-name> 
    <url-pattern>*.csv</url-pattern> 
</filter-mapping> 
+0

這是有道理的。我是否必須自己實施「任務角色」?這聽起來像我應該先實現它們,然後到達Servlet過濾器。我現在正在存儲會話的用戶名,然後FileServlet會檢查它是否被命名爲「admin」。 –

+0

您需要在會話中設置一個變量'userRole':'session.setAttribute(userRole,「nameUserRole」)'。此操作必須在用戶成功通過授權階段後執行。所以按照收到的信息,明確了他應該分配給他什麼角色 – kapand

+0

好了,現在。假設我已經實現了該方法。現在,「FileServlet」可以檢測它是否被他的URL模式直接調用,或者是否被其他JSP調用? 我的意思是,如果非管理員用戶將調用FileServlet粘貼到瀏覽器地址欄,它應該阻止他。 –

2

使用servlet過濾器檢查submiited url並根據會話對象標識用戶角色。如果它找到了授權用戶,那麼它可以重新回到下載頁面