2012-07-28 243 views
0

我使用JSF創建一些用戶授權/檢查之前,進入安全/目錄下的特定頁面,但沒有成功...我試着用phaselistener和過濾器,但仍stil ...好了,任何幫助是非常歡迎。JSF 2.0似乎忽略過濾器

我正在使用Eclipse Juno。

我的web.xml如下:

<filter> 
<filter-name>AuthorizationFilter</filter-name> 
<filter-class>login.security.AuthorizationFilter</filter-class> 
</filter> 
<filter-mapping> 
<filter-name>AuthorizationFilter</filter-name> 
<url-pattern>/secure/*</url-pattern> 
</filter-mapping> 
<servlet-mapping> 
<servlet-name>Faces Servlet</servlet-name> 
<url-pattern>*.xhtml</url-pattern> 
</servlet-mapping> 

AuthorizationFilter看起來是這樣的:

public class AuthorizationFilter implements Filter { 
@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {  
HttpServletRequest req = (HttpServletRequest) request; 
login.Login_bean login_bean = (login.Login_bean) 
req.getSession().getAttribute("username"); 
if (login_bean != null && login_bean.isLoggedIn()) { 
chain.doFilter(request, response); 
} else { 
HttpServletResponse res = (HttpServletResponse) response; 
res.sendRedirect(req.getContextPath() + "/index.xhtml"); 
} 
} 

隨着被覆蓋的破壞()和init。它是從幾個地方複製/過去的。

Login_bean管理和會話範圍,當用戶名/密碼對是正確的我得到這個運行:

if(password.equals(dbpassword)){ 
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("username", username); 
FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("email", email); 
this.visibleLogout="true"; 
this.visibleLogin="false"; 
return "valid"; 
} 

和目錄結構的樣子:

WebContent 
-> secure 
    -> projects.xhtml 
-> index.xhtml 

的index.xhtml我想要的禁止訪問:

<p:menuitem id="projects" value="#{menuBean.projectsValue}" action="#{menuBean.navTo(projects)}" icon="ui-icon-circle-triangle-e" />. 

最後 menuBean.navTo()爲:

public String navTo(String whereTo) 
{ 
return "/secure/projects"; 
} 

我都碰了壁不知爲什麼...即使改變的url-pattern爲/ faces /安全/ *我我仍轉發到projects.xhtml

全faces-config.xml中

<?xml version="1.0" encoding="UTF-8"?> 

<faces-config xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_1.xsd" 
    version="2.1"> 


    <managed-bean> 
     <managed-bean-name>languageBean</managed-bean-name> 
     <managed-bean-class>languageControl.LanguageBean</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 

    <managed-bean> 
     <managed-bean-name>menuBean</managed-bean-name> 
     <managed-bean-class>menuControl.MenuBean</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 

    <navigation-rule> 
     <description>login_rule</description> 
     <from-view-id>/index.xhtml</from-view-id> 
     <navigation-case> 
      <from-action>#{login_bean.checkValidUser}</from-action> 
      <from-outcome>valid</from-outcome> 
      <to-view-id>/nav.xhtml</to-view-id> 
     </navigation-case> 
     <navigation-case> 
      <from-action>#{login_bean.checkValidUser}</from-action> 
      <from-outcome>invalid</from-outcome> 
      <to-view-id>/index.xhtml</to-view-id> 
     </navigation-case> 
    </navigation-rule> 

    <application> 
     <locale-config> 
      <default-locale>en</default-locale> 
      <supported-locale>gr</supported-locale> 
     </locale-config> 
     <resource-bundle> 
      <base-name>languageControl.messages</base-name> 
      <var>msg</var> 
     </resource-bundle> 
    </application> 
    <validator> 
     <validator-id>passwordValidator</validator-id> 
     <validator-class>registration.passwordValidator</validator-class> 
    </validator> 
    <managed-bean> 
     <managed-bean-name>Login_bean</managed-bean-name> 
     <managed-bean-class>login.Login_bean</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
    <managed-bean> 
     <managed-bean-name>sendMail</managed-bean-name> 
     <managed-bean-class>common.sendMail</managed-bean-class> 
     <managed-bean-scope>request</managed-bean-scope> 
     <!-- <managed-property> <property-name>email</property-name> <value>#{sendMail.email}</value> 
      </managed-property> --> 
    </managed-bean> 

    <validator> 
     <validator-id>EmailValidator</validator-id> 
     <validator-class>registration.EmailValidator</validator-class> 
    </validator> 

    <managed-bean> 
     <managed-bean-name>RegistrationBean</managed-bean-name> 
     <managed-bean-class>registration.RegistrationBean</managed-bean-class> 
     <managed-bean-scope>session</managed-bean-scope> 
    </managed-bean> 
</faces-config> 

充分的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" 
    id="WebApp_ID" version="3.0"> 
    <display-name>personalSite</display-name> 
    <welcome-file-list> 
     <welcome-file>index.xhtml</welcome-file> 
    </welcome-file-list> 
    <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> 

<filter> 
     <filter-name>AuthorizationFilter</filter-name> 
     <filter-class>login.security.AuthorizationFilter</filter-class> 
</filter> 
<filter-mapping> 
     <filter-name>AuthorizationFilter</filter-name> 
     <url-pattern>/secure/*</url-pattern> 
</filter-mapping> 

</web-app> 
+0

也許還有另一種配置會造成奇怪的行爲。一切看起來像它的工作。另外,您正在使用哪個應用程序服務器? – 2012-07-28 15:09:32

回答

0

你在調試器中運行呢?我會在「doFilter()」的頂部放置一個斷點,並查看過濾器是否正在執行。一旦找出它是否真的在執行,請逐步執行代碼(假設它正在過濾)並查看邏輯爲什麼沒有按預期執行。如果它沒有開火,你可以打賭它在配置中可能是虛假的。

+0

我使用glassfish 3.1.2,很確定過濾器沒有執行,但看不到爲什麼..我會檢查你的調試提示是100%確定的。我也從Eclipse /服務器清理項目..如果可能,我給你的web.xml和faces-config,也許你可以看到一個缺陷,我不能 – Panos 2012-07-28 23:23:56

+0

所以最後加載工作..我注意到我想念managedbean註釋並過濾器以某種方式工作。問題現在出現..不是過濾器應該工作*之前*進入projects.xhtml,以防止瀏覽特定的xhtml,而不是之後? 我的意思是..當我點擊在projects.xhtml commandbuttons我重定向迴應索引應該,而不是當我點擊menuitem – Panos 2012-07-30 12:48:27