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>検証と一緒に使用している場合と組み合わせることができます。例えば

<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

あなたの場合、そのパターンを介してURLからそれらにアクセスするために、いくつかのパターンをxhtmlファイルにマップする必要がありますが、同時に.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 に答える