2012-06-25 3 views
3

내가 두 페이지를 가지고있다 톰캣 7필터가 호출되지

를 사용하여 로그인 시스템과 간단한 JSF 웹 응용 프로그램 코드를하려고 해요 : index.xhtml을과 /restricted/welcome.xhtml.

아래의 페이지 "/ 제한/*"사용자가 로그인 만 접근 할 수 있어야합니다. welcome.xhtml에 직접 서핑 ​​

welcome.xhtml이를 우회에 index.xhtml에서 전달, 내 필터가 실행되도록한다 필터. 필터가 실행되지 않는 이유를 상상할 수 없습니다.

RestrictedAreaFilter.java :

@WebFilter(value = { "/restricted/*" }, dispatcherTypes = { DispatcherType.FORWARD, DispatcherType.REQUEST, DispatcherType.ASYNC, DispatcherType.ERROR, DispatcherType.INCLUDE }) 
public class RestrictedAreaFilter implements Filter { 

@Override 
public void destroy() { 

} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpReq = (HttpServletRequest) request; 
    User user = (User) httpReq.getSession().getAttribute("user"); 

    if (user != null && user.isLoggedIn()) { 
     chain.doFilter(request, response); 
    } else { 
     httpReq.getRequestDispatcher("/access_denied.xhtml").forward(request, response); 
    } 
} 

@Override 
public void init(FilterConfig arg0) throws ServletException { 

} 

} 
<!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:f="http://java.sun.com/jsf/core" 
xmlns:h="http://java.sun.com/jsf/html"> 
<head> 
<title>Login</title> 
</head> 
<body> 
<h:form id="form"> 
    <h:panelGrid id="grid" columns="2"> 
     <h:outputLabel value="Benutzername" for="username" /> 
     <h:inputText id="username" value="#{login.username}" /> 
     <h:outputLabel value="Passwort:" for="password" /> 
     <h:inputSecret id="password" value="#{login.password}"> 
      <f:validateLength minimum="4" maximum="16" /> 
     </h:inputSecret> 
     <h:message style="color: red" for="password" /> 

    </h:panelGrid> 
    <h:commandButton id="login" value="Login" action="#{login.proceed}" /> 
</h:form> 
</body> 
</html> 
@ManagedBean(name = "login") 
@RequestScoped 
public class LoginBean { 

@ManagedProperty(value = "#{user}") 
private User user; 

private String username; 
private String password; 

public void setUser(User user) { 
    this.user = user; 
} 

public String getUsername() { 
    return username; 
} 

public void setUsername(String username) { 
    this.username = username; 
} 

public String getPassword() { 
    return password; 
} 

public void setPassword(String password) { 
    this.password = password; 
} 

public String proceed() { 
    user.setLoggedIn(true); 

    return "restricted/welcome.xhtml"; 
} 
} 
+0

범위 사용자? 쿠키를 삭제하고 액세스를 다시 시도하십시오 –

+0

안녕 Jigar Joshi. 사용자 bean의 세션 범위가 지정됩니다. 삭제 된 쿠키 및 새 브라우저로 테스트되었습니다. – BlackEye

+0

당신은 바로'welcome.xhtml'에 GET 요청을하고 있습니다, 맞습니까? –

답변

1

RequestDispatcher#forward()이 웹 애플리케이션의 코드 어딘가에 호출 된 때 FORWARD 디스패처에만 트리거됩니다. 표준 JSF 네비게이션 핸들러는 그렇게하지 않는다. 그것은 단지 ViewHandler#createView()을 호출하고 FacesContext#setViewRoot()에 의해 현재보기로 설정합니다.

대신 리디렉션을 보내기 :

public String proceed() { 
    user.setLoggedIn(true); 

    return "restricted/welcome.xhtml?faces-redirect=true"; 
} 

이 또한 방법으로 권장되는 관행입니다. 이제 책갈피화할 수있는 페이지입니다 (URL 변경은 이제 브라우저의 주소 표시 줄에 반영됩니다). 페이지를 새로 고치거나 F5를 눌러도 POST가 불필요하게 다시 실행되지 않으며 뒤로 버튼을 눌러도 놀라움을 느끼지 않습니다. 당신이 정말로 JSF를 사용하여 FORWARD 디스패처를 호출에 주장하는 경우

, 당신은 항상 ExternalContext#dispatch() 방법을 사용할 수 있지만, 이것은하지 권장되는 방법 입니다.

public void proceed() throws IOException { 
    user.setLoggedIn(true); 

    FacesContext.getCurrentInstance().getExternalContext().dispatch("restricted/welcome.xhtml") 
} 
+0

OP가 POST를하지 않고 직접 가져 오는 경우 OP는 해당 페이지를 볼 수 있습니다. 질문에 대한 의견을 참조하십시오. –

+0

@지가 : 다른 문제입니다. – BalusC

+0

감사합니다. BalusC – BlackEye

관련 문제