2009-05-28 2 views
0

바닐라 서블릿과 JSF 페이지 모두에 대한 오류를 처리하는 서블릿 필터가 있습니다.http GET 매개 변수 JSF 사용시 일부가 누락되었습니다.

오류가 감지되면 사용자는 피드백을 보낼 수있는 오류 페이지로 리디렉션됩니다. 그런 다음 ErrorBean 개체의 값을 읽으려고합니다. 그러나 때로는 오류가 존재하지 않습니다 - 오류가 50-50 번 발생할 가능성이 있습니다. 내가

FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap() 

를 사용하는 경우

는 때때로 1 개 항목, 때로는 빈지도와지도를 반환합니다. 모든 경우에 ID는 http 수준에서 전달됩니다.

저는이 문제의 원인을 실제로 재현 할 수 없습니다. 여기에 관련 코드 (도우미 메소드 + 빈 구현 생략)가 있습니다. ErrorFilter는 /*에 맵핑되고 ErrorBean은 JSF가 관리하는 세션 범위 bean입니다.

ErrorFilter

public class ErrorFilter implements Filter 
{ 
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException 
    { 
    HttpServletRequest hreq = (HttpServletRequest) req; 
    HttpServletResponse hres = (HttpServletResponse) resp; 

    try 
    { 
     chain.doFilter(req, resp); 
    } 
    catch (IOException e) 
    { 
     handleError(e, hreq, hres); 
    } 
    catch (ServletException e) 
    { 
     handleError(e, hreq, hres); 
    } 
    catch (RuntimeException e) 
    { 
     handleError(e, hreq, hres); 
    } 
    } 

    private static void handleError(Throwable e, HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException 
    { 
    final RequestInfo requestInfo = new RequestInfo(getUri(req), req.getSession().getId(), null, null, UserFactory.getUser(), InetAddress.getByName(req.getRemoteAddr())); 
    String token = new DecimalFormat("00000000").format(Math.abs(RANDOM.nextInt() % Integer.MAX_VALUE)); 
    //log msg 
    //send mail in a different thread 

    if (!req.getRequestURI().startsWith("/faces/error.jsp")) 
    { 
     resp.sendRedirect("/faces/error.jsp?token=" + token); 
    } 
    else 
    { 
     //log that an infite loop occurred 
     throw new ServletException(crapMsg, e); 
    } 
    } 
} 

ErrorBean

public class ErrorBean implements Serializable 
{ 
    private String feedback; 
    private String lastToken; 

    public String getLastErrorCode() 
    { 
    return "your token: " + getToken(); 
    } 

    private String getToken() 
    { 
    final String token = (String) FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("token"); 
    //here the "token" returns null although it is sent via get. 

    if (token != null) 
    { 
     if (!token.equals(lastToken)) 
     { 
      // reset data on token change. 
      feedback = null; 
     } 
     lastToken = token; 
    } 

    return lastToken; 
    } 

    public void setFeedback(String feedback) 
    { 
    this.feedback = feedback; 
    } 

    public String getFeedback() 
    { 
     if (feedback == null) 
     { 
     feedback = getDefaultMessage(); 
     } 

     return feedback; 
    } 

    public void send() 
    { 
    sendMail(lastToken,feedback); 
    } 
} 

답변

2

의 요청이 이미 리디렉션 할 때 문맥이 (가) 처음 다를 매개 변수를 볼 수 직면 resp.sendRedirect("/faces/error.jsp?token=" + token);

하지만 당신은 다른 요청을 할 때, 얼굴이 그것으로 조작을하는 네비게이션 시스템이고 페이지를 리디렉션하고 분명히 필터가 chain.doFilter(req,resp); 일 때 JSF 탐색 모델을 실행하고 요청 매개 변수를 제거하도록 권한을 부여합니다.

제 제안은 다른 세션 값에 추가 할 수 있다는 것입니다. 그러면 더 쉽게 조작 할 수 있습니다.

+0

나는 그것이 왜 실패하는지 정확히 알지 못했습니다. 당신이 제안한 해결책이 잘 작동 했으므로, 그것을 해결 방법으로 구현했습니다. 세션에 토큰 속성을 저장합니다. 이것은 강력하게 작동합니다. –

0

나는 FacesContext는 서블릿 필터에서 사용할 수 있다고 생각하지 않습니다. FacesServlet (FacesContext를 생성)을 치기 전에 필터가 실행되지 않습니까?

시도 읽기 : http://www.thoughtsabout.net/blog/archives/000033.html

+0

오류 페이지가 관리 빈을 사용하여 필터로 설정된 HTTP 매개 변수를 찾는 JSF 페이지 (이 경우 컨텍스트를 사용할 수 있음)를 의미한다고 생각합니다. – McDowell

+0

그는 "int"토큰 "을 가진 errorInfo 객체를 생성합니다. 이 객체를 보지 않고 어떻게 사용했는지 알지 못합니다. 해당 개체의 .getToken()은 우리가 알고있는 모든 것에 대해 null을 반환 할 수 있습니다. – GreenieMeanie

+0

토큰은 다음과 같이 생성 된 임의의 문자열입니다. \t this.token = new DecimalFormat ("00000000"). format (Math.abs (RANDOM.nextInt() % Integer.MAX_VALUE)); –

0

오류 페이지 (웹 애플리케이션의 framerwork, 예를 들어 의미) 일반적으로 JSF 자체보다 더 큰 무엇의 맥락에서 JSF에 대한 좋은 후보가되지 않습니다. 네, FaceContext는 원할 때마다 사용할 수있는 것에 의존 할 수 없습니다. JSF 요청을 처리하기 위해 Faces Servlet에 의해 생성되며 요청이 완료되면 폐기됩니다. 요청을 요청할 때 더 이상 장기간 지속되지 않습니다.

또한 URL은 대부분의 웹 애플리케이션에서 JSF와 완전히 다른 의미를 지닙니다. 그들은 어떤 페이지가 요청되거나 표시되는지에 대한 절대적인 표시보다 대화를 추적하는 데 사용되는 핸들과 비슷합니다.

내가보기에는 겸손 관점에서