2014-09-25 91 views
0

我需要阻止直接訪問jsp頁面。安全約束不起作用

我已經把我的web.xml是這樣的:

<security-constraint> 
    <web-resource-collection> 
    <web-resource-name>My Hidden Pages</web-resource-name> 
    <url-pattern>/*.jsp</url-pattern> 
    </web-resource-collection> 
    <auth-constraint></auth-constraint> 
</security-constraint> 

,但所有的頁面仍然在瀏覽器地址欄中輸入自己的地址進行訪問。 我該如何解決這個問題?

僅供參考我使用的碼頭 - Maven的插件和servlet-API 2.5

感謝

回答

0

你不隱瞞的JSP的方式。

有在構建時的幾個常見的方法(最好選擇第一)

  1. 預編譯JSP和不包括在WAR文件的實際JSP文件。

  2. 把你的JSP文件放在WEB-INF文件夾的某處。然後通過Controller servlet完成對jsps的訪問。這使用WEB-INF的安全性來防止直接訪問JSP文件,這是所有servlet容器必須遵守的。

    見過去計算器問題,在此:

    還有更多的,只是搜索 「在WEB-INF JSP」 發現更多關於這個概念。

  3. 正確配置Jetty的JSP實現。完成後,這意味着所有對JSP文件的訪問都必須經過該實現的JspServlet

    查看webdefault.xml例如如何定義這種映射。

    如果您在啓動時看到關於"No JSP Support for "的錯誤或警告,那麼您知道您尚未正確配置JSP,這意味着所有JSP文件將以靜態方式提供服務。注意:如果您使用舊版本的Jetty(任何早於7.6.16版本的版本),或者使用較舊版本的Java(任何早於1.7_40的版本),或者在Windows上使用Jetty(此處存在問題Jetty 9.3.0將在下個月發佈),那麼即使這可以解決。

+0

只需更新jetty-maven-plugin(現在我正在使用9.2.3),'security-constraint'標籤就開始工作。謝謝。 – helloIAmPau 2014-09-26 08:07:01

0

您的<url-pattern>不正確。它應該是<url-pattern>*.jsp</url-pattern>而不是/。根據規範允許的模式是:

A URL模式是一個相對於應用程序上下文的URI。 模式可以包括:

  • 路徑映射,從/並用/*結束該圖案識別與給定的路徑開始,例如任何資源, /catalog/*/catalog/products/*
  • 擴展映射,從*.這模式標識具有給定擴展名的任何資源,例如,*.jsp*.gif
  • 默認servlet映射,僅包含/此模式標識默認servlet映射t應用程序的servlet。
  • 完全匹配此模式使用表示特定資源的字符串,例如/snoop是servlet映射,而 是/list/banner.jsp是文件映射。

如果你想確保給定文件夾中,你需要使用的圖案像/folder/*,如果你想保護的所有網頁只使用*.jsp,如果你想保護的所有頁面,除了index.jsp頁面,則需要添加另一個限制,允許明確訪問/index.jsp文件。

+0

我需要隱藏應用程序根目錄中的所有jsps(這是我的url映射的原因)。順便說一句,使用'* .jsp'模式頁面仍然可以訪問。 – helloIAmPau 2014-09-26 05:45:05

+0

@helloIAmPau然後它必須是Jetty中的問題,因爲* .jsp在其他容器中工作。 – Gas 2014-09-26 08:39:33

+0

是的!看到我上面的評論。 – helloIAmPau 2014-09-28 17:42:27