3

ユーザーがログインしておらず、制限されたページにアクセスしようとすると、login.xhtmlにリダイレクトされるJSFで基本的なセキュリティシステムを実行しようとしています。これは、サーブレット フィルターで行われます。

私の問題は、 resp.sendRedirect("login.xhtml"); を使用する場合です。ログインページはすべてのリソース、css、スクリプトなどを失います。そのため、ページはスタイルなしで表示されます。

web.xml

<?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</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>
<filter>
<filter-name>restrict</filter-name>
<filter-class>br.com.jetcar.filter.RestrictionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>restrict</filter-name>
<url-pattern>*.xhtml</url-pattern>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
</web-app>

template.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:p="http://primefaces.prime.com.tr/ui"
xmlns:f="http://java.sun.com/jsf/core">
<h:head>
    <h:outputScript library="primefaces" name="jquery/jquery.js"/>
    <h:outputStylesheet library="css" name="template.css" />
    <h:outputScript name="clock.js" library="js"></h:outputScript>
    <title><ui:insert name="title">Bem-Vindo</ui:insert></title>
</h:head>
<body>
 <p:growl id="messages"/>  
    <div id="header">
        <ui:insert name="header">
            <div id="headerTitle">JetCar</div>
            <div id="clock"></div>
        </ui:insert>
    </div>

    <div id="menu">
        <ui:insert name="menu">
            <ui:include src="menu.xhtml" />
        </ui:insert>
    </div>

    <div id="content">
        <ui:insert name="content">
        </ui:insert>
    </div>

    <div id="footer">
        <ui:insert name="footer">
            <p>Desenvolvido por</p>
            <p>Rodrigo Cavalcante de Souza</p>
            <p>Jorge Luis</p>
        </ui:insert>
    </div>
</body>
</html>

login.xhtml

<?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">
<ui:composition template="resources/template/template.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"
            xmlns:p="http://primefaces.org/ui">
<ui:define name="title">Login</ui:define>
<ui:define name="content">


</ui:define>
</ui:composition>

まだテスト中なので、index.xhtml はログインと同じように見えますが、何が問題なのですか?

クロムコンソールからのエラー

 GET http://localhost:8080/JetCar/javax.faces.resource/growl/assets/login.xhtml 404  (Not Found)
login.xhtml:3GET http://localhost:8080/JetCar/javax.faces.resource/themes/sam/login.xhtml 404 (Not Found)
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/jquery/login.xhtml 404 (Not Found)
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/login.xhtml 404 (Not Found)
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/core/login.xhtml 404 (Not Found)
login.xhtml:4GET http://localhost:8080/JetCar/javax.faces.resource/login.xhtml 404 (Not Found)
login.xhtml:6GET http://localhost:8080/JetCar/javax.faces.resource/growl/login.xhtml 404 (Not Found)
login.xhtml:10Uncaught ReferenceError: jQuery is not defined
chrome-extension://ffdcfjdljhbehggjdkdioajnknjcpbjb/js/sbc_cookies_mon.js:1Uncaught   TypeError: Cannot read property 'tagName' of null

私はprimefaces 2.2.1、glassfish 3.1、JSF 2.0を使用しています

編集:リソースも .xhtml 拡張子を使用しているため、フィルターに干渉していることに気付きました。

修理:if(req.getSession().getAttribute("func") == null && !pageRequested.contains("login.xhtml") && !pageRequested.contains("/javax.faces.resource")) resp.sendRedirect("login.xhtml");

4

3 に答える 3

17

私はしばしばこの方法を使用して、Java Bean から直接リダイレクトします。 FacesContext.getCurrentInstance().getExternalContext().redirect(Url);

于 2012-04-22T02:51:25.350 に答える
3

JSF 2 で特に JSF 上のページをリダイレクトする適切な方法は、メソッド呼び出しからビューの名前を返すことです。

例えば:

public String doLogin() {
    //apply the login logic.
    return "name/of/the/view?facesRedirect=true"
}
于 2012-04-21T16:58:43.053 に答える
1

フィルターは、HTTP 要求も JSF リソースにリダイレクトしています。フィルタ ロジックを変更して、現在のリクエストが JSF リソース リクエストでないかどうかのチェックを追加する必要があります。ResourceHandler.RESOURCE_IDENTIFIERこれを行うには、リクエスト URI がコンテキスト パスの後に始まっていないかどうかを確認します。

if (request.getRequestURI().startsWith(request.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) {
    chain.doFilter(request, response);
}
else {
    response.sendRedirect(request.getContextPath() + "/login.xhtml");
}
于 2012-04-22T13:14:28.530 に答える