我在这里遇到一个 Java 网络项目问题。我正在处理的项目是用标准 jsp 和 jsf 页面混合而成的。 应用程序的主页,称为 main.jsp,是一个标准的 jsp 页面,需要访问在用于检查用户身份验证的 servlet 过滤器中创建的具有 session 作用域的托管 bean。 在我的 web.xml 中,我设置了面部引擎必须响应 .jsf 和/faces/* 请求
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>extensionsFilter</filter-name>
<url-pattern>/faces/*</url-pattern>
</filter-mapping>
如果我使用 http//myserver/myapp/faces/main.jsp
打开我的应用程序,一切正常。
如果我使用 http://myserver/myapp/main.jsp
打开我的应用程序,我会得到一个错误,因为面部上下文尚未创建。
无论是设置欢迎页面还是设置 apache 重定向,当用户只需在浏览器中键入 h**p://myserver/myapp 时,我都能够让应用程序打开正确的页面(faces 上下文中的 main.jsp):那是因为页面/faces/main.jsp 物理上不存在。
我想可能有 2 种解决方案:即使在/faces/* 模式之外也能够让 faces 上下文开始,或者找到一种方法让 tomcat 重定向到/faces/main.jsp,即使页面没有存在...但我尝试的一切都失败了。
最佳答案
只是不要通过http://myserver/myapp/main.jsp 打开您的应用程序, 而不是 http://myserver/myapp/faces/main.jsp或(更优选)http://myserver/myapp/main.jsf .
如果您完全担心最终用户不应该能够访问 FacesServlet
的 url-pattern
之外的 JSP 页面(否则这个问题不会很有道理 ;) ),然后选择 *.jsf
模式并在 上添加一个带有空
模式到 auth-constraint
的 security-constraint
>*.jspweb.xml
。这应该注意最终用户将无法直接请求 *.jsp
URL。
<security-constraint>
<display-name>Restrict direct access to JSP files</display-name>
<web-resource-collection>
<web-resource-name>JSP files</web-resource-name>
<url-pattern>*.jsp</url-pattern>
</web-resource-collection>
<auth-constraint />
</security-constraint>
当您使用 /faces/*
映射时,这是不可能的。我也会在 web.xml
中删除它。
此外,为了覆盖正在键入 http://myserver/myapp 的最终用户,然后只需将 main.jsf
定义为 web.xml
中的 welcome-file
并删除其他定义的欢迎文件。然而,在 Tomcat(可能还有其他 servlet 容器)中,您需要创建一个完全具有该名称的空文件,以欺骗服务器该文件存在于磁盘上。
关于jsp - jsf上下文创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3387094/