2013-10-03 3 views
0

서블릿에서 다음과 같은 코드 비트를 사용하여 최근까지 문제없이 BalusC가 제안한 세션 백업 빈을 찾습니다. 이제는 Internet Explorer에서만 작동합니다. Chrome과 Firefox는 원래의 백업 빈보다 완전히 새로운 백업 빈을 얻는 것으로 보입니다. Backing Bean에서 함수를 호출 할 때 원래 bean에서 확실히 초기화 된 backing bean의 오브젝트에 대한 널 포인터 오류로 넘어집니다.IE가 아닌 다른 브라우저를 사용할 때 세션 범위가 설정된 관리 빈을 Servlet에서 사용할 수 없음

FacesContext facesContext = FacesUtil.getFacesContext(req, res); 
ProductSelection productSelection = (ProductSelection) facesContext.getApplication().evaluateExpressionGet(facesContext, "#{productSelection}", ProductSelection.class); 

if(productSelection.getProductType() == null) 
{ 
    System.out.println("Sevlet: product type is NULL; did not get the original backing bean"); 
} 
else 
{ 
    System.out.println("Sevlet: product type is: " + productSelection.getProductType().getProductTypeName()); 
} 

이 코드를 테스트하고 Java에 대한 몇 가지 업데이트가 있었지만 그 원인인지 확실하지 않습니다. 내 구성에서 뭔가를 변경했거나 Chrome 및 Firefox가 코드에서 변경된 것 같습니다 (있을 법하지 않음). 비슷한 문제가있는 사람이 있습니까? 나는 거기에서 어디로 가야할지에 관해서는, 어떤 오류가 보이지 않는 것처럼 자바 빈 코드에 대한 뒷받침 빈과 디버깅 기술을 찾지 못하는 것과 관련이 없다 (그들은 코드를 주석 처리하지 않는다. 아주 잘 그것은 따를 것이 곤란하다); 어떤 제안이라도 대단히 감사하겠습니다.

Netbeans 7.01, JSF 2.0, Glassfish 3.1 및 Derby 데이터베이스를 사용하고 있습니다. 필자는 필자의 타워와 랩톱에서 테스트를 실시했으며, Windows XP와 Win 7 모두에서이 작업을 수행하고 있습니다. JRE는 7 업데이트 40 빌드 1.7.0_40-b43입니다. JDK는 1.6.0_04입니다. Chrome 버전은 29.0.1547.76 m입니다. Firefox는 23.0.1입니다. Internet Explorer는 8.0.6001.18702입니다.

FacesUtil는 (하지만이 일하고 잘) BalusC의 코드를 약간 다릅니다 : 사전에

package searchselection; 

import javax.faces.FactoryFinder; 
import javax.faces.component.UIViewRoot; 
import javax.faces.context.FacesContext; 
import javax.faces.context.FacesContextFactory; 
import javax.faces.lifecycle.Lifecycle; 
import javax.faces.lifecycle.LifecycleFactory; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

// By BalusC http://balusc.blogspot.com 
// Utility to get the FacesContext. 
// Used by the CriteriaServlet to get the backing bean when the user submits a customised 
// search criteria object. 
public class FacesUtil 
{ 
    // Getters ----------------------------------------------------------------- 
    // 
    public static FacesContext getFacesContext(ServletRequest request, ServletResponse response) 
    { 
     // Get current FacesContext. 
     FacesContext facesContext = FacesContext.getCurrentInstance(); 

     // Check current FacesContext. 
     if (facesContext == null) 
     { 

      // Create new Lifecycle. 
      LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY); 
      Lifecycle lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE); 

      // Create new FacesContext. 
      FacesContextFactory contextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY); 
      facesContext = contextFactory.getFacesContext(
        request.getServletContext(), request, response, lifecycle); 

      // Create new View. 
      UIViewRoot view = facesContext.getApplication().getViewHandler().createView(
        facesContext, ""); 
      facesContext.setViewRoot(view); 

      // Set current FacesContext. 
      FacesContextWrapper.setCurrentInstance(facesContext); 
     } 

     return facesContext; 
    } 

    // Helpers ----------------------------------------------------------------- 
    // Wrap the protected FacesContext.setCurrentInstance() in a inner class. 
    private static abstract class FacesContextWrapper extends FacesContext 
    { 

     protected static void setCurrentInstance(FacesContext facesContext) 
     { 
      FacesContext.setCurrentInstance(facesContext); 
     } 
    } 
} 

종류 덕분에 ...

+1

브라우저간에 JSESSION_ID에 변경 사항이 있습니까? – kolossus

+0

안녕하세요. Kolossus, 도와 주셔서 감사합니다. 문제가 발생하기 전에 JSESSIONID 쿠키를 확인하고 쿠키 값은 Chrome 및 Firefox에서 변경되지 않은 채로 남아 있습니다 (사용자가 묻는 것으로 가정합니다. 내 무지를 용서하십시오. 사용자가 언급 할 때까지 JSESSIONID가 존재한다는 것을 전혀 알지 못했습니다.). Internet Explorer 8에서 쿠키를 볼 때 찾은 지침이 올바르지 않아 잘 모르겠지만 작동 중입니다 ... – Robbie62

+0

req.getSession(). getAttribute ("productSelection")'은 무엇을 제공합니까? 'req.getSession(). getId()'는 JSF에서 bean이 처음으로 생성되었을 때와 정말로 동일합니까? – BalusC

답변

0

일-A-라운드 : 이드에 변화 세션 어떤 이유에서든, 애플릿에서 서블릿이 호출 될 때 Firefox와 Chrome. 세션 ID를 저장하고 서블릿에 HttpURLConnection 연결에 설정하여 서블릿이 올바른 백킹 빈을 얻도록했습니다. productSelection 백킹 빈에서

: 나는 애플릿이 완전히 기준 파일을로드를 이야기하기 전에로드 될 때까지 기다려야하는 자바 스크립트 함수를 사용하고있는 애플릿이 포함 된 웹 페이지에서

private String sessionID = ""; // With getter 
. 
. 
. 
FacesContext facesContext = FacesContext.getCurrentInstance(); 
HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false); 
sessionID = session.getId(); 

이 될 것입니다 사용자가 수정 한 다음 처리를 위해 백업 빈으로 다시 전송합니다. 단순히 애플릿에 대한 기준 파일과 함께 세션 ID를 통과했다 :

애플릿 버튼 코드에서
<SCRIPT language="javascript"> 
     function waitUntilLoaded() 
     { 
      if (document.criteriaApplet.isActive()) 
      { 
      var object = document.getElementById ("criteriaApplet"); 
      criteriaApplet.loadCriteriaFile((object.codeBase + "#{productSelection.productUsage.searchCriteriaObjectUrl}"), "#{productSelection.sessionID}"); 
      } 
      else 
      { 
       settimeout(waitUntilLoaded(),500) 
      } 
     } 
</SCRIPT> 

, 수정 된 기준이 servelet를 통해 백업 빈에 파일을 다시 제출, 나는 세션 ID를 추가 HttpURLConnection 연결 :

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
      connection.setDoInput(true); 
      connection.setDoOutput(true); 
      connection.setUseCaches(false); 
      connection.setRequestMethod("POST"); 
      connection.setRequestProperty("Content-Type", "application/x-java-serialized-object"); 
      connection.setRequestProperty("Cookie","JSESSIONID=" + sessionID); 
      ObjectOutputStream out = new ObjectOutputStream(connection.getOutputStream()); 
      out.writeObject(searchSubmitObject); 
      out.flush(); 
      out.close();