2012-01-16 108 views
1

我在寫一個簡單的小應用程序,它是一個預訂系統。在系統中有兩個角色:管理員和用戶。所有請求都通過唯一的servlet進行工作。 Index.jsp(用戶和管理員的登錄頁面)在沒有幫助的情況下工作。所以,我有起始URL看起來像這樣:在Java EE web應用程序中製作自定義URL

本地主機:8080/[AppName的] /index.jsp

爲了確保安全,我寫了一個過濾器,將不會允許匿名用戶將任何網頁,除index.jsp外;管理員進入用戶頁面,用戶進入管理頁面。但問題是,我不能正確映射過濾器,因爲在我的應用程序的所有網址看起來像:

本地主機:8080/[AppName的]/servlet的命令= [命令名]

因爲這一點,這樣的映射,如(當然,在web.xml過濾器已經這個映射之前描述):

<filter-mapping> 
    <filter-name>Security</filter-name> 
    <url-pattern>/servlet?command=[commandName]</url-pattern> 
</filter-mapping> 

不工作,我不喜歡它,因爲在這種情況下,有必要規定應用程序的所有命令。 在這方面,我有一個想法,使URL時smbdy登錄這樣的:

本地主機:8080/[AppName的] /用戶 - 用戶

本地主機:8080/[AppName的]/admin - for admin

在web-inf文件夾中,我有內部文件夾「pages」,其中有幾個內部文件夾:「error」,「admin」和「user」,它們爲這些頁面保留jsp頁面角色和錯誤。

如何實現所提出的想法?我懷疑這是很微不足道的,但我沒有找到答案,因爲我甚至不知道如何命名我的問題。

+0

這[頁碼](http://docs.oracle。 com/javaee/1.4/tutorial/doc/Security5.html)可能會有所幫助。你可能也想看看這個[問題](http://stackoverflow.com/questions/6202778/am-i-doing-the-servlet-filter-correctly)。 – Dallas 2012-01-16 00:29:00

+0

感謝您的聯繫,但他們不是我要找的。 第一個講述認證類型,第二個講述servlet處理用戶請求的情況。不幸的是,他們兩個都沒有製作自定義URL的解決方案。 – juniorIce 2012-01-16 13:30:38

+0

爲什麼不將Filter過濾器映射到Servlet本身,而不是url模式? – 2012-01-17 14:12:26

回答

0

我想我現在得到它; - 首先創建初始servlet(index.jsp不是servlet),一旦用戶訪問您的頁面,他將被重定向到它。例如localhost:8080/YouWebAppName/IndexServlet。

IndexServlet檢查是否設置了會話,如果沒有,則重定向到可訪問的索引。jsp,如果會話已設置,那麼它檢查角色,如果角色設置爲用戶,則重定向到localhost:8080/YourWebAppName/UserServlet,如果會話設置爲Admin,則重定向到localhost:8080/YourWebAppName/AdminServlet。

在管理員和用戶servlet中,如果會話變量分別等於user/admin,則首先檢查第一個位置。

如果有你想在servlets共享方法,使第三的servlet調用它,但是你想,然後UserServlet和AdminServlet應該擴大這個servlet

+0

是的,這是正確的答案,我會「檢查」它是正確的。 但是,如果我的web應用程序中只能有一個servlet,那該怎麼辦?有沒有相同的解決方案,但沒有創建任何新的servlet? – juniorIce 2012-01-17 17:09:16

0

我最近有類似的東西在我的項目,嘗試這樣的:

<servlet-mapping> 
    <servlet-name>YourServletName</servlet-name> 
    <url-pattern>/YourServletName/*</url-pattern> 
</servlet-mapping> 

在servlet代碼我有方法:

protected String getActionSegment(HttpServletRequest request) { 
    String action = request.getRequestURI(). 
     replace(request.getContextPath() + 
      request.getServletPath(), ""). 
       replace("/", ""). 
        trim(); 
    return action.length() > 0 ? action : "index"; 
} 

該方法返回的名稱action,如果Url是localhost:8080/MyWebApp/MyServlet,那麼默認情況下它會重定向到index.jsp(可以更改) 在servlet執行方法中,您只需定義每個應該執行的操作(以及重定向的位置)例如:

if(action.equals("admin")) { 
     //do something 
    } else if (action.equals("user")) { 
     //do something else 
    } 

讓我知道,如果這就是你的意思。 順便說一句,你也可以限制對jsp文件夾的訪問,並且只有在servlet重定向到jsp時才能使其工作。

+0

它接近我的解決方案,但仍不是我想要解決的問題。我需要我的servlet在瀏覽器中寫入URL: 「http:// localhost:8080/Myservlet/user」 用戶登錄後。然後,當這個用戶在系統中工作時,所有的URL應該像 「http:// localhost:8080/Myservlet/user/servlet?command = ......」 通過這個我可以映射用戶的過濾器中的網址,例如/Myservlet/user/*。 這就是我的意思。 – juniorIce 2012-01-16 19:48:01

+0

我不確定你想要在用戶名中包含acctuall,例如對於用戶名爲NICK的用戶,你將擁有:localhost:8080/Myservlet/user,localhost: 8080/Myservlet /尼克? – Stugal 2012-01-17 11:27:35

+0

不,不。我想爲任何用戶提供「用戶」,爲每個管理員提供「管理員」。 – juniorIce 2012-01-17 13:34:06