2012-06-05 1 views
6

JSF를 사용하여 Java EE에서 웹 응용 프로그램 개발. 모든 페이지는 'j_security_check'작업을 통해 인증 양식을보고 볼 수 없으며 'j_username'및 'j_password'를 입력합니다. 성공적으로 로그인 한 후로그인 후 리디렉션이 잘못됨 (Java EE/JSF)

하지만, 난 안 나는 모든 JS 코드와 스크립트 파일 jsf.js 찾고 있어요 내가 액세스하고 싶은 페이지로하지만,이 URL 그래서

/faces/javax.faces.resource/jsf.js?ln=javax.faces&stage=Development 

로 리디렉션하고 보려는 페이지 대신에 매번 웹 루트 또는 다른 페이지에 액세스 할 때마다이 URL로 리디렉션됩니다. 그런 다음 URL을 임의의 페이지로 변경하면 잘로드되고 로그인됩니다.

나는이 문제가 이미 마술처럼 사라져서 올바르게 리디렉션되었다고 말해야합니다. 몇 주가 지나면 다시 부서졌지만 그것이 내 잘못이라면 나는 그것을하지 않는다. 나는 그것이 원인인지 모른다. 나는 리다이렉트 나 네비게이션 규칙을 전혀 망치고 있지 않았다.

PrettyFaces도 사용하고 있습니다.

편집 : 컨테이너가 인증 검사를 트리거 한 마지막 HTTP 요청에 리디렉션됩니다 보안 관리

<security-constraint> 
    <display-name>secured</display-name> 
    <web-resource-collection> 
     <web-resource-name>all</web-resource-name> 
     <description/> 
     <url-pattern>/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
     <role-name>teacher</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>secured for admins</display-name> 
    <web-resource-collection> 
     <web-resource-name>admin pages</web-resource-name> 
     <description/> 
     <url-pattern>/admin/*</url-pattern> 
    </web-resource-collection> 
    <auth-constraint> 
     <description/> 
     <role-name>admin</role-name> 
    </auth-constraint> 
</security-constraint> 
<security-constraint> 
    <display-name>unsecured</display-name> 
    <web-resource-collection> 
     <web-resource-name>css</web-resource-name> 
     <description/> 
     <url-pattern>/css/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>js</web-resource-name> 
     <description/> 
     <url-pattern>/js/*</url-pattern> 
    </web-resource-collection> 
    <web-resource-collection> 
     <web-resource-name>img</web-resource-name> 
     <description/> 
     <url-pattern>/img/*</url-pattern> 
    </web-resource-collection> 
</security-constraint> 
<login-config> 
    <auth-method>FORM</auth-method> 
    <realm-name>wetk-security</realm-name> 
    <form-login-config> 
     <form-login-page>/faces/login.xhtml</form-login-page> 
     <form-error-page>/faces/login.xhtml</form-error-page> 
    </form-login-config> 
</login-config> 
+0

'web.xml' 파일의' 요소에는 무엇이 있습니까? –

+0

질문을 수정했습니다. – redhead

답변

8

. 귀하의 경우에는 자동으로 포함 된 JSF ajax API JavaScript 파일 일 것입니다. 브라우저가 JS 파일을 서버 측에서 완전히로드 한 상태에서 브라우저가 인증 된 페이지를 브라우저 캐시에서 완전히로드했거나 조건부 GET 요청으로 JavaScript 파일의 캐시 유효성을 테스트 한 경우에 발생할 수 있습니다 .

당신은 JSF 자원 (인증 검사에서 <h:outputScript>, <h:outputStylesheet><h:graphicImage>를 제외하고 싶습니다. 당신은 일반적인 URL 패턴 /javax.faces.resource/*을 제외하여. 당신은 당신이 분명히있어로 /faces 접두사 패턴을 추가 할 수 있다는 것을 할 수 *.xhtml 접미사 패턴 대신에 그것을 사용.

또한 (로그 아웃 한 후 버튼을 다시 눌러 예) 캐시에서 브라우저 로딩을 방지하기 위해 하지 캐시 제한 페이지에 브라우저를 지시해야합니다. 다음 필터를지도 <security-constraint>과 동일한 URL 패턴을 사용하십시오.

@WebFilter("/secured/*") // Use the same URL pattern as <security-constraint> 
public class NoCacheFilter implements Filter { 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpReq = (HttpServletRequest) request; 
     HttpServletResponse httpRes = (HttpServletResponse) response; 

     if (!httpReq.getRequestURI().startsWith(httpReq.getContextPath() + ResourceHandler.RESOURCE_IDENTIFIER)) { // Skip JSF resources (CSS/JS/Images/etc) 
      httpRes.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      httpRes.setHeader("Pragma", "no-cache"); // HTTP 1.0. 
      httpRes.setDateHeader("Expires", 0); // Proxies. 
     } 

     chain.doFilter(request, response); 
    } 

    // ... 
} 
+0

그래서 귀하의 코드를 시도하고 로그인 프로세스 (첫 번째 요청 및 양식 제출 후) 필터는 요청한 페이지를받지 못합니다. URL을 다시 변경할 때만받습니다. 그래서, 다시 작동하지, 나는 여전히 JS 스크립트를 참조하십시오. – redhead

+0

테스트하기 전에 브라우저 캐시를 지우셨습니까? – BalusC

+0

나는 Opera를 완전히 삭제했지만 아무런 변화도 시도하지 않았습니다. – redhead