0

我想防止在我的项目中直接访问 *.xhtml 文件。在页面中,有调用某些 bean 的某些方法的 commandLinks。这些 bean 将视图名称作为字符串返回。

return "campaign.xhtml?faces-redirect=true";

如果用户将以下内容写入浏览器的地址栏,我不希望用户看到 xhtml 文件。

http://localhost:8080/myApp/faces/campaign.xhtml

或者

http://localhost:8080/myApp/faces/campaign.xhtml?faces-redirect=true

因为,在某些 bean 中,我填充了这些 xhtml 视图。但是,如果用户直接访问 xhtml 文件,用户会看到这些视图没有填充信息。

当我在 web.xml 文件中使用时,访问被拒绝。但是,在这种情况下,当 bean 返回值“campaign.xhtml?faces-redirect=true”时,它也不能显示视图。bean 的访问也被拒绝。

我能做些什么来防止这种情况发生?

谢谢。

法鲁克·库什坎

4

2 回答 2

5

用户在没有填写信息的情况下看到这些视图。

preRenderView如果信息已填写,只需检查事件侦听器。如果没有,请重定向回来。

<f:event type="preRenderView" listener="#{bean.init}" />

public void init() throws IOException {
    if (information == null) {
        ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
        externalContext.redirect(externalContext.getRequestContextPath() + "/otherpage.xhtml");
    }
}

如有必要,您可以将它与FacesContext#isValidationFailed()您是否实际上也在使用<f:viewParam>with 验证结合起来。例如

<f:viewParam name="id" value="#{bean.information}" required="true" />
<f:event type="preRenderView" listener="#{bean.init}" />

public void init() throws IOException {
    FacesContext context = FacesContext.getCurrentInstance();
    if (context.isValidationFailed()) {
        ExternalContext externalContext = context.getExternalContext();
        externalContext.redirect(externalContext.getRequestContextPath() + "/otherpage.xhtml");
    }
}

更新:在 JSF 2.2 中,您可以使用<f:viewAction>它。

<f:viewAction listener="#{bean.check}" />
public String check() {
    if (information == null) {
        return "otherpage?faces-redirect=true";
    } else {
        return null;
    }
}
于 2012-10-31T13:21:07.833 回答
-1

在您的情况下,您需要将一些模式映射到您的 xhtml 文件,以便通过该模式从 URL 访问它们,同时对 .xhtml 扩展名的访问将受到限制。所以在你的 web.xml 中:

<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>*.someExtension</url-pattern>
    </servlet-mapping>

  <security-constraint>  
    <display-name>Restrict access to XHTML Documents</display-name>
    <web-resource-collection>
      <web-resource-name>XHTML</web-resource-name>
      <url-pattern>*.xhtml</url-pattern>
    </web-resource-collection>
    <auth-constraint/>
  </security-constraint>

这就是你的 bean 应该返回的:

return "campaign.someExtension?faces-redirect=true";

通过这种方式,您将能够通过 commandLinks 将用户重定向到您希望的页面,但是当用户键入时

http://localhost:8080/myApp/faces/campaign.xhtml

或者

http://localhost:8080/myApp/faces/campaign.xhtml?faces-redirect=true

对 URL 的访问将被拒绝。

于 2015-07-24T08:25:54.070 回答