我想阻止直接访问项目中的* .xhtml文件。在页面中,有一些commandLinks调用某些bean的某些方法。那些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的访问权限也被拒绝。
我该怎么做才能防止这种情况发生?
感谢。
FarukKuşcan
答案 0 :(得分: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");
}
}
如果您实际上还在使用<f:viewParam>
进行验证,则可以根据需要将其与FacesContext#isValidationFailed()
结合使用。 E.g。
<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;
}
}
答案 1 :(得分:-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。