2013-09-03 3 views
1

이 질문에 많은 질문이 있었지만 거의 모든 메시지에 다음과 같은 코드가 추가 될 것을 제안합니다. FullAjaxExceptionHandler가 일반 대신 아약스 리디렉션 일의 리디렉션 (this similar question 참조)FullAjaxExceptionHandler가 Ajax 요청에 대한 오류 페이지로 리디렉션하지 않음

if ("partial/ajax".equals(request.getHeader("Faces-Request"))) { 
// JSF ajax request. Return special XML response which instructs JavaScript that it should in turn perform a redirect. 
response.setContentType("text/xml"); 
response.getWriter() 
    .append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>") 
    .printf("<partial-response><redirect url=\"%s\"></redirect></partial-response>", loginURL); 
} else { 
    // Normal request. Perform redirect as usual. 
    response.sendRedirect(loginURL); 
} 

내 질문은 단순히 모든 오류 처리를 할 Omnifaces의 FullAjaxExceptionHandler를 구성하고있어 것입니다, 나는 가로 채고 그 봄 보안 또는 컨테이너 보안을 관리하지 않아도 FullAjaxExceptionHandler가 요청하기 전에 그 일을 할 수 있습니다. FullAjaxExceptionHandler로 중단 점을 만들면 다음 코드 줄을 실행하면 내 오류 페이지가 여전히 리디렉션되지 않는 것을 볼 수 있습니다.

String viewId = Faces.normalizeViewId(errorPageLocation); 
ViewHandler viewHandler = context.getApplication().getViewHandler(); 
UIViewRoot viewRoot = viewHandler.createView(context, viewId); 
context.setViewRoot(viewRoot); 
context.getPartialViewContext().setRenderAll(true); 
     ... 
    context.renderResponse(); 

대신, 예외가 시작된 Ajax 요청이 그것의 응답 본문에 있습니다

그것은 어떻게 해야하는 일을하지 않거나 내가 뭔가를 놓친 거지 FullAjaxExceptionHandler과 같은
<?xml version='1.0' encoding='UTF-8'?> 
    <partial-response> 
     <changes> 
      <update id="javax.faces.ViewRoot"><![CDATA[<html xmlns="http://www.w3.org/1999/xhtml">... html of error page here ... </html>]]></update> 
      <update id="javax.faces.ViewState"><![CDATA[-3527653129719750158:5595502883804776498]]></update> 
     </changes> 
    </partial-response> 

?

업데이트

브라우저 JS 출력 콘솔 화면 캡 부착.

<script type="text/javascript"> 
//<![CDATA[ 
scrollTo(0, 0); 
//]]> 
</script> 

이 : 문제는

내 오류 페이지의 HTML 형식이 잘못된 것으로 밝혀을 식별 JS output console

, 그것은 브라우저에서 일치하지 않는 태그 오류가 발생 다음 코드를 포함 CDATA 태그를 조기에 폐쇄 한 것처럼 보였다. 이 HTML은 <h:outputScript/> 태그의 결과입니다. 실제로 필요하지 않기 때문에 제거했습니다.

+0

어떤 PrimeFaces 버전입니까? 이전 버전은'@ all' : https://code.google.com/p/omnifaces/wiki/KnownIssues#PrimeFaces_2.0-3에 문제가있었습니다.1 적어도 PrimeFaces (및 번들 jQuery)가 원인이되지 않도록 제외하려면'

대신''을 사용하면 어떨까요? Ajax 응답은 완전히 멋지게 보입니다. 그래서 그 단계까지 모든 것이 잘됩니다. 어떤 이유로 JavaScript에 의해 현재 HTML 문서에 적용되지 않았으므로 문제는 본질적으로 JS 측면에 있습니다. JS 컨텍스트에 오류/충돌이있는 경우에도 발생할 수 있습니다. JS 콘솔을 확인 했습니까? – BalusC

+0

PF3.5를 사용하고 있습니다. 내 콘솔에서 볼 수있는 유일한 오류는 부분 업데이트를 구문 분석하지 못했기 때문입니다. 콘솔 화면 캡처로 내 게시물을 업데이트합니다. PF 버튼을 사용하지 않고 으로 바꿨습니다. 실제로 예상대로 오류 페이지로 리디렉션되었습니다. 제 마지막으로 고칠 수있는 것이 있는지 확실하지 않습니까? – citress

+0

그래, 이것은 PF 문제입니다. 답변을 게시하기 전에 어떤 브라우저를 사용하고 있는지 알고 싶습니다. 또한 ''또는 ''가있는 경우에도 알고 싶습니다. – BalusC

답변

0

ajax 응답이 완전히 정상적으로 보입니다. <update id="javax.faces.ViewRoot">에 전체 오류 페이지 문서가 포함되어 있으므로 FullAjaxExceptionHandler이 올바르게 수행되었습니다.

구체적인 문제는 클라이언트 측 또는 Ajax 응답을 검색 한 후에 오류 페이지 문서 자체에서 발생했을 가능성이 큽니다. 그런 다음 자바 스크립트가 아약스 응답을 구문 분석하고 이에 따라 현재 HTML 문서를 바꿉니다. 브라우저의 JavaScript 콘솔을 확인하면 해당 단계에서 문제에 대한 단서를 얻을 수 있습니다. 특정 경우에이 문제는 <h:outputScript>에 의해 렌더링 된 콘텐츠 주위에 중첩 된 CDATA 블록으로 인해 발생하며 JavaScript 파싱 오류가 발생하는 것으로 보입니다.

불행히도 Mojarra 버전으로 문제를 재현 할 수 없습니다. 아마도 그 블록을 추가 할 책임이있는 커스텀/타사 스크립트 렌더러가있을 것입니다. CDATA. PartialViewContext#isAjaxRequest()true을 반환하면 해당 스크립트 렌더러는 CDATA 블록을 건너 뜁니다. 여전히 문제를 파악할 수 없다면 <h:outputScript>을 일반 HTML <script>으로 대체하거나 궁극적으로는 —을 제거하는 것이 가장 좋습니다.

+0

Mojarra 2.1.24로 테스트 해 보셨습니까? 어쨌든, 나는 여전히 내 오류 페이지에 javascript가 필요할 수도있는 것처럼 보입니다. – citress