安全约束不起作用

时间:2014-09-25 13:49:14

标签: java jsp servlets jetty web.xml

我需要阻止对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>

但是仍然可以通过在浏览器地址栏中输入地址来访问所有页面。 我该如何解决这个问题?

仅供参考我正在使用jetty-maven-plugin和servlet-api 2.5

感谢

2 个答案:

答案 0 :(得分:0)

你不会那样隐藏jsps。

有一些常见的方法(首选最佳选择)

  1. 在构建期间预编译JSP,并且不要在WAR文件中包含实际的JSP文件。

  2. 将您的JSP文件放在某个WEB-INF文件夹中。然后通过Controller servlet访问jsps。这使用WEB-INF的安全性来防止直接访问JSP文件,这是所有servlet容器必须遵守的。

    请参阅过去的stackoverflow问题:

    还有更多,只是搜索“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将在下个月左右发布,然后即使这可以解决。

答案 1 :(得分:0)

您的<url-pattern>不正确。如果没有<url-pattern>*.jsp</url-pattern>,则应为/。根据规范允许的模式是:

  

URL模式是一个相对于应用程序上下文的URI。   模式可以包括:

     
      
  • 路径映射,以/开头,以{{1}结尾}此模式标识以给定路径开头的任何资源,例如,   /*/catalog/*
  •   
  • 扩展名映射,以/catalog/products/*开头此模式标识具有给定扩展名的任何资源,例如*.*.jsp
  •   
  • 默认servlet映射,仅包含*.gif此模式标识应用程序的默认servlet。
  •   
  • 完全匹配此模式使用表示特定资源的字符串,例如,/是一个servlet映射,   /snoop是一个文件映射。
  •   

如果要保护给定文件夹中的页面,则需要使用/list/banner.jsp之类的模式,如果要保护所有页面只使用/folder/*,如果要保护除{{1}以外的所有页面您需要添加另一个允许显式访问*.jsp文件的约束。