2010-02-01 4 views
1

페이지가 2 페이지에 전달되는 JSP 페이지가 있습니다. 페이지에서 전달 된 정보를 사용하여 두 번째 페이지에 정보를 표시합니다. 브라우저를 다시 사용할 때 문제가 발생합니다. 브라우저를 뒤로 설정하여 데이터를 업데이트하고 새로 고침 할 수 있습니까?내 JSP가 새로 고쳐지지 않습니다

+0

주고 코드, 일부 문장 부호를 추가하고 다른 한 JSP에서 셔플 어떻게 – Bozho

+0

더 나은 설명? –

+0

브라우저에서 뒤로 버튼을 사용하여 ist jsp로 이동하여 두 번째 페이지에 표시되는 데이터를 기반으로하는 두 개의 매개 변수를 전달하는 하이퍼 링크를 – Sam

답변

1

유일한 방법은 이것에 대한 HttpSession는 데이터와 함께, 전체 세션 - 동안 사용할 수 있음 - 그래서 사용하는 패턴을 후 리디렉션-얻을 클라이언트 측 캐시 비활성화 - 뒤로 버튼은 브라우저 기록/캐시에서 페이지를 요청하지 않고 대신 서버에서 새로운 것을 요청합니다.

다음은 빗금 예 page1.jsp의 모습입니다. (meta 헤더, 사람들은 당신이) 어떤 방법을 변경하지 마십시오 브라우저 캐시에게 crossbrowser 호환 방식을 사용하지 않도록 설정 최소 있습니다 : page2 뒤에 서블릿 클래스에서

<!doctype html> 
<html lang="en"> 
    <head> 
     <title>SO question 2175119</title> 
     <meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"> 
     <meta http-equiv="Pragma" content="no-cache"> 
     <meta http-equiv="Expires" content="0"> 
    </head> 
    <body> 
     <form action="page2" method="post"> 
      <input type="text" name="foo" value="${page1.foo}"> 
      <input type="text" name="bar" value="${page1.bar}"> 
      <input type="submit"> 
     </form> 
    </body> 
</html> 

는 당신이 요청 매개 변수를 수집해야 같은 데이터 구조 Map<String, String> 또는 (위 있듯이 당신이 ${page1}에 의해 JSP EL에 액세스 할 수 있도록) 속성 이름으로 page1으로 HttpSession#setAttribute()에 의해 세션에 넣어 fullworthy 자바 빈즈 클래스 :에서

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    Map<String, String> page1params = new HashMap<String, String>(); 
    page1params.put("foo", request.getParameter("foo")); 
    page1params.put("bar", request.getParameter("bar")); 
    request.getSession().setAttribute("page1", page1params); 

    // Do remnant of your business logic here if necessary. 

    // Now redirect to page2.jsp (else the back button won't work, 
    // because the POST has been expired due to the meta headers). 
    response.sendRedirect("page2.jsp"); 
} 

66,049,203,210 같은 JSP EL 방식 page1.jsp에서와 같이 양식 데이터를 액세스 할 수 있습니다

... 
<p>Entered value for "foo" is: ${page1.foo}</p> 
<p>Entered value for "bar" is: ${page1.bar}</p> 
... 

당신이 page2.jsp에서 다시 버튼을 누르면,이 서버에서 page1.jsp를 서버에 새로운 GET 요청을 발사하고 검색합니다, 세션의 데이터가 미리 채워져 있습니다.

이 모든 단 한가지주의 할 점이 있습니다. 세션 내에 여러 개의 브라우저 창이 열려 있으면 입력/변경된 값이 서로 영향을줍니다. 실제 양식 버튼 대신에 브라우저 뒤로 버튼을 사용하여 page2.jsp이라고 주장하는 한 해결할 수 없습니다.

희망이 도움이됩니다.

0

질문의 핵심은 다음과 같습니다. 일시적으로 캐시 된 이전 버전의 페이지를 표시하는 대신 사용자가 '뒤로'를 누른 후 브라우저가 첫 번째 페이지를 다시 요청하도록하려면 어떻게해야합니까?

대답은 페이지 1을 페치 할 수없는 결과를 캐시 할 수 없게 만드는 것입니다.이것은 HTTP 응답 헤더를 수행하고, JSP에 그 헤더를 설정하는 신속하고 더러운 방법입니다 :

<% 
response.setHeader("Cache-Control","no-cache"); 
response.setHeader("Pragma","no-cache"); 
response.setDateHeader ("Expires", 0); 
%> 
+0

필터/서블릿이나 HTML 메타 태그를 사용하는 것이 좋다. 게다가,이 세트는 파이어 폭스와 다른 몇몇에서는 작동하지 않을 것이다. 아, 이것은 또한 새로운 데이터를 유지한다는 그의 질문에 대답하지 않습니다. 올바른 접근법과 올바른 헤더에 대한 내 대답을 참조하십시오. – BalusC

관련 문제