2014-09-29 41 views
0

我怎样才能将xhtml文件放在WEB-INF中,这样只有应用程序才能直接访问它们?具体而言,以便鸟页不能直接公开访问。该项目来自apress example如何将xhtml从/ web /移动到/ web/WEB-INF /?

项目树:

NetBeansProjects/Birds/ 
├── build.xml 
├── nbproject 
│   ├── ant-deploy.xml 
│   ├── build-impl.xml 
│   ├── genfiles.properties 
│   ├── private 
│   │   └── private.properties 
│   ├── project.properties 
│   └── project.xml 
├── src 
│   ├── conf 
│   │   └── MANIFEST.MF 
│   └── java 
│    └── dur 
│     └── Hello.java 
└── web 
    ├── eagle.xhtml 
    ├── faces 
    ├── falcon.xhtml 
    ├── index.xhtml 
    ├── menu.xhtml 
    ├── parrot.xhtml 
    ├── resources 
    │   └── css 
    │    ├── cssLayout.css 
    │    └── default.css 
    ├── template.xhtml 
    └── WEB-INF 
     └── web.xml 

的web.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"> 
    <context-param> 
     <param-name>javax.faces.DEFAULT_SUFFIX</param-name> 
     <param-value>.xhtml</param-value> 
    </context-param> 
    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 
    <session-config> 
     <session-timeout> 
      30 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
</web-app> 

的index.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 

    <body> 
     This and everything before will be ignored 
     <ui:composition template="template.xhtml"> 
      <ui:define name="navigation"> 
       <ui:include src="menu.xhtml"/> 
      </ui:define> 
     </ui:composition> 
     This and everything after will be ignored 
    </body> 
</html> 

名为menu.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <body> 
     This and everything before will be ignored 
     <ui:composition> 
      <h3>Contents table</h3> 
      <hr/> 
      <h:panelGrid columns="1"> 
       <h:commandLink value="Home" action="home" /> 
       <h:commandLink value="Parrot" 
           action="parrot" /> 
       <h:commandLink value="Eagle" 
           action="eagle" /> 
       <h:commandLink value="Falcon" 
           action="falcon" /> 
      </h:panelGrid> 
     </ui:composition> 
     This and everything after will be ignored 
    </body> 
</html> 

所引用:

<?xml version='1.0' encoding='UTF-8' ?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <head> 
     <title>The Happy Birds Directory</title> 
     <style type="text/css"> 
      <!-- 
      .box { 
       float: right; 
       width: 50%; 
       border: black dotted 1px; 
       padding: 5px 
      } 
      --> 
     </style> 
    </head> 
    <body> 
     <h:form> 
      <h1>The Happy Birds Directory</h1> 
      <div class="box"> 
       <ui:insert name="navigation"/> 
      </div> 
      <ui:insert name="main"> 
       Welcome to the nest! 
      </ui:insert> 
     </h:form> 
    </body> 
</html> 

parrot.xhtml:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:ui="http://java.sun.com/jsf/facelets" 
     xmlns:h="http://java.sun.com/jsf/html" 
     xmlns:f="http://java.sun.com/jsf/core"> 
    <body> 
     This and everything before will be ignored 
     <ui:composition template="template.xhtml"> 
      <ui:define name="navigation"> 
       <ui:include src="menu.xhtml"/> 
      </ui:define> 
      <ui:define name="main"> 
       <h1>Parrot</h1> 
       <p> 
        Parrots are interesting birds... 
       </p> 
      </ui:define> 
     </ui:composition> 
     This and everything after will be ignored 
    </body> 
</html> 

回答

1

对不起,如果我missunderstand你的方法!

没有必要把XHTML文件的WEB-INF导演,因为你的脸的servlet模式被定义为你上面:

<servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

在这种情况下,没有公共的用户可以得到的直接/真正来源您的JSF XHTML文件。 Web应用程序容器响应每次调用* .xhtml和编译的html内容。

也别担心!

+0

好吧,我喜欢这样,用户只能得到编译结果 - 这似乎足够安全,我的目的。你指的是什么误解? – Thufir 2014-09-29 23:34:40

+0

@Thufir:如果你想通过浏览器无法访问这些文件,在这种情况下,我误解了你的目的:)。 – 2014-09-30 12:14:16

2

如果你想不使用地址栏访问的页面,我认为你能做的最好的事情就是避免在您的应用中重定向,这样url不会显示给最终用户,所以不会被收藏。但是,这并不妨碍最终用户使用浏览器端调试器或尝试使用一组url并找到属于您的页面的URL。发生这种情况是因为您使用GET请求来访问视图。

如果你真的想避免这种情况,你应该使用POST从视图导航,即使这是完全不鼓励。不要使用模板,只需使用ui:include就可以访问您的母版页并包含您的子视图,并使用ajax更改位置。这可能会带来一些问题,例如,浏览器的后退按钮无法正常工作。

我的建议是与避免重定向的第一选择。您应该在WEB-INF目录中放入的文件是template.xhtml文件,最终用户无法直接访问它。

参见: