2012-07-10 2 views
1

JSF 2.0에서 플래시 범위 으로 어려움을 겪고 있습니다. (나는 다른 곳과 같은 "범위"는 아니지만 종종 하나라고 말합니다). (Mojarra)JSF 2.0 플래시 범위 - 쿠키 경로

내 문제는 플래시 쿠키가 플래시에 개체를 두는보기의 경로에 바인딩된다는 것입니다.
같은 응용 프로그램의 다른 경로로 리디렉션 된 후 개체를 사용할 수 없게됩니다. 리디렉션 탐색 반대편에서 String (및 객체)을 사용할 수 있어야합니다.

@WebFilter을 구현했으며이를 대체하여 ServletResponse을 다음 래퍼로 바꾸는 것이 목적입니다.

private class ResponseWrapper extends HttpServletResponseWrapper{ 

    private final String path; 

    public ResponseWrapper(HttpServletResponse response, String contextpath) { 
     super(response); 
     this.path = contextpath; 
    } 

    @Override 
    public void addCookie(Cookie cookie) { 

     // Hardcoded name from jsf-impl # com.sun.faces.context.flash.ELFlash 
     final String FLASH_COOKIE_NAME = "csfcfc"; 

     if (cookie.getName().equals(FLASH_COOKIE_NAME)){ 
      cookie.setPath(path); 
     } 
     super.addCookie(cookie); 
    } 

} 

사실상이 래퍼는 Flash-Cookie가 응용 프로그램 context-root에 바인딩되도록 수정합니다.

제 질문은 이것이 내가 감독하지 않는 다른 문제를 일으키는 지 여부입니다.
처음에보기의 경로에 Flash이 바인딩되어야하는 이유를 이해할 수 없습니다.

이 정말 귀하의 질문에 대답하지 않습니다

답변

2

하나는 올바르지 않습니다

는 플래시 쿠키는 플래시 객체를 넣어보기의 경로로 결합되어 있다는 점이다.

플래시 범위는 정확히 한 번 리디렉션을 유지합니다.

즉, 플래시 범위에있는 개체는 리디렉션에서도 유지됩니다. 쿠키 및 필터 덤비는 경우 http://mkblog.exadel.com/2010/07/learning-jsf2-using-flash-scope/

, 당신은 아마 뭔가 잘못하고 있습니다. JSF는 이러한 개념을 추상화하여 POJO를 사용하여 작업을 수행 할 수 있습니다. Java EE 쿠키를 엉망으로 만들지 마십시오. 필요한 것보다 훨씬 많은 작업을 수행하게 될 것이고 매우 취약한 코드를 즉시 만들 수 있습니다.

Flash flash = FacesContext.getCurrentInstance().getExternalContext().getFlash(); 

넣어하려면 :

flash.put("myObject", myObject); 

는 효율적으로 활용하려면 다음

Object myObject = flash.get("myObject"); 

것이다 해킹 원인 문제를

이 같은에 대한 참조를 잡아, 플래시 범위를 사용하려면 JSF와 함께? 확실한 확신을 가지고, 지금이 아니라면, 나중에 Mojarra를 사용해 보거나, 다른 컨테이너를 사용하거나, MyFaces로 전환하십시오.

+1

> 가정 중 하나가 잘못되었습니다. - 틀린 것은 아닙니다. 버그 (실제로 여러 번)로 인해 이것은 실제로 Mojarra에서 일어난 일입니다. –