2016-12-31 4 views
0

J2EE 웹 필터 내에서 정적 메서드를 사용하는 것이 안전한 지 (교착 상태가 없는지) 아니면 인스턴스 메서드를 사용해야하는지 궁금합니다. I 가지고J2EE WebFilter 필터에서 정적 메서드를 사용하는 것이 안전합니까?

Navigation.getLoginURL()

정적 방법으로 다음과 같은 방법 doFilter

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest httpServletRequest = (HttpServletRequest) request; 
    HttpServletResponse httpServletResponse = (HttpServletResponse) response; 
    String contextPath = httpServletRequest.getContextPath(); 
    if ((httpServletRequest.getRequestedSessionId() != null && 
      !httpServletRequest.isRequestedSessionIdValid()) || (loginBean == null || loginBean.getUserId() == -1)) { 
     httpServletResponse.sendRedirect(contextPath + Navigation.getLoginURL()); 


    } else { 
     chain.doFilter(request, response); 
    } 
} 

. 이것이 교착 상태로 이어질 수 있습니까?

+0

스레드가 다른 스레드에서 잠긴 리소스를 기다리는 동안 차단 될 때 교착 상태가 발생하며 그 반대의 경우도 마찬가지입니다. 여기에는 전혀 관련이 없습니다. 그렇다면 왜 교착 상태가 발생합니까? –

+0

여러 요청이 동시에 필터를 치려고하는 경우 – Jim

+0

그럼 뭐야? 그들은 모두 동시에 정적 메서드를 실행합니다. –

답변

1

정적 인 방법의 요점은 Filter 인스턴스의 상태에 대한 종속성이 없다는 것입니다. 로그인 URL은 응용 프로그램에서 동일합니다. 보호 할 상태가 없으므로 아무 것도 잠글 필요가 없습니다.

(System.out.println과 같은) 잠금 기능이있는 정적 메서드 호출이 교착 상태에 있다는 것을 의미하지는 않습니다. API 서블릿과 필터를 구현하는 Java EE 코드는 높은 수준의 동시성을 지원해야하기 때문에 많은 잠금 작업을 수행하지 않아야합니다. 보기의 구현의 관점에서이 보면

은 섹션 4.5.1 (모호한 문서를 해석) 당신이 안전하게 전화를 연습 자바 동시성에서이 견적을 볼 수있는 결정하는 데 도움이 될 것입니다

당신은 추측해야 할 것입니다. 추측의 품질을 향상시키는 한 가지 방법은 단순히 컨테이너를 사용하는 사람이 아닌 컨테이너 또는 데이터베이스 공급 업체와 같이 구현할 사람의 관점에서 스펙을 해석하는 것입니다. 서블릿은 항상 컨테이너 관리 스레드에서 호출되며, 둘 이상의 스레드가있는 경우 컨테이너가이를 알고 있다고 가정하는 것이 안전합니다. 서블릿 컨테이너는 HttpSession 또는 ServletContext와 같은 여러 서블릿에 서비스를 제공하는 특정 객체를 사용할 수 있도록합니다. 따라서 서블릿 컨테이너는 여러 스레드를 생성하고 Servlet.service와 같은 메서드를 호출하여 합리적으로 ServletContext에 액세스 할 수 있기 때문에 이러한 객체를 동시에 액세스해야합니다.

이러한 개체가 유용 할 수있는 단일 스레드 컨텍스트를 상상할 수 없으므로 사양에서 명시 적으로 요구하지는 않지만 스레드로부터 안전하다고 가정해야합니다. 게다가 클라이언트 측 잠금이 필요한 경우 클라이언트 코드가 어떤 잠금을 동기화해야합니까? 문서는 말하지 않으며, 추측하는 것은 터무니없는 것처럼 보입니다. 이 "합리적인 가정"은 ServletContext 또는 HttpSession에 액세스하는 방법을 보여주고 클라이언트 측 동기화를 사용하지 않는 사양 및 공식 자습서의 예제에 의해 보강됩니다.