2010-07-05 2 views
0

내 제목이 혼동을 일으킬 수 있으니 계속 읽으십시오. 나는 다음과 같은 기술을 사용하고 있습니다. Spring, Hibernate, JSF (RichFaces), MySQL, Internet Explorer.JSF (Richfaces)에서 뒤로 버튼을 눌렀을 때 웹 페이지가 만료되었습니다. submit

 
item a 
item b 
item c 
item d 
item e 

을 나는 다음과 같은 버튼이 같은 페이지 :

그래서 같은 데이터 테이블 RichFaces에 표시되는 항목의 목록을 검색, 편집, 추가, 삭제새로운 .

사용자가 검색 문자열을 입력하면 (예 :

 
item c 

사용자가 새로운 버튼을 누르면, 요청하여 다른 페이지로 리디렉션 될 것이다 :

"부품 C '를 누르 검색 버튼, 그것은 일치 항목의 목록 등이 표시
FacesContext facesContext = FacesContext.getCurrentInstance(); 
facesContext.getExternalContext().redirect(page + ".jsf"); 

해당 페이지에서 IE의 브라우저 뒤로 버튼을 누르면 페이지에 "웹 페이지 만료 됨"이 표시됩니다. 이것은 무엇이며 어떻게 이것을 피할 수 있습니까?

답변

3

웹 페이지는 당신이 브라우저 기록에서 캐시되지 않은 POST 요청을 얻기 위해 노력하고이 오류가 발생합니다

을 만료되었습니다. 이 동작은 완전히 예상됩니다. 이 "문제"를 해결하려면 캐시를 켜거나 POST를 GET으로 바꿔야합니다.

브라우저 캐시를 사용하는 것은 실제로 쉽습니다. Cache-Control: no-cache 및 관련 헤더를 해당 POST 요청의 HTTP 응답에서 제거하면됩니다. 그러면 최종 사용자는 POST 데이터가 서버에 재전송 될 것이라는 경고 대화 상자 만 표시합니다. 주문을하거나 삭제하는 것과 같이 완전히 멱등하지 않은 요청이 실제로 발생하는 경우에는 바람직하지 않습니다. POST를 GET으로 대체하는 것이 더 좋은 해결책입니다. Google과 마찬가지로 검색 결과를 얻는 것은 GET으로 수행해야합니다.

POST를 GET으로 바꾸는 것은 버전 2.0 이전의 JSF에서는 쉽지 않습니다. 가장 좋은 방법은 POST 후에 리디렉션을 실행하고 관심있는 데이터를 #{param}에서 소유 한 요청 매개 변수로 관리 속성으로 전달하거나 (권장) 세션 범위에 관심 데이터를 저장하는 것입니다 (권장하지 않음). 완전히 다른 대안은 간단한 HTML <form action="searchresults.jsf">으로 JSF <h:form>을 대체하고 제출 된 쿼리가 관리 속성 또는 요청 매개 변수 맵에서 수집 된 후 searchresults.jsf과 연결된 백킹 빈의 @PostConstruct 메서드로 검색 작업을 수행하는 것입니다.

관련 문제