我需要阻止对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
感谢
答案 0 :(得分:0)
你不会那样隐藏jsps。
有一些常见的方法(首选最佳选择)
在构建期间预编译JSP,并且不要在WAR文件中包含实际的JSP文件。
将您的JSP文件放在某个WEB-INF文件夹中。然后通过Controller servlet访问jsps。这使用WEB-INF的安全性来防止直接访问JSP文件,这是所有servlet容器必须遵守的。
请参阅过去的stackoverflow问题:
还有更多,只是搜索“web-inf中的jsp”以发现有关此概念的更多信息。
正确配置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
文件的约束。