2012-07-28 241 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