J2ee 웹 필터 내에서 정적 메서드를 사용하는 것이 안전한지 (교착 상태에 대한 가능성 없음) 아니면 인스턴스 메서드를 사용해야합니까? 다음과 같은 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);
}
}
어디
Navigation.getLoginURL ()
정적 메서드입니다. 이로 인해 교착 상태가 발생할 수 있습니까?
이것이 정적 메서드라는 점은 Filter 인스턴스의 상태에 대한 종속성이 없다는 것입니다. 로그인 URL은 애플리케이션 전체에서 동일합니다. 보호 할 상태가 없기 때문에 아무것도 잠글 이유가 없습니다.
(System.out.println과 같은) 잠그는 것에 대한 정적 메서드를 호출한다고해서 코드가 교착 상태가되는 것은 아닙니다. API 서블릿 및 필터를 구현하는 Java EE 코드는 높은 수준의 동시성을 지원해야하므로 많은 잠금을 수행하지 않아야합니다.
구현 자의 관점에서 이것을 보면 무엇을 안전하게 호출 할 수 있는지 결정하는 데 도움이 될 것입니다. Java Concurrency in Practice, 섹션 4.5.1 (모호한 문서 해석)에서이 인용문을 참조하십시오.
당신은 추측해야 할 것입니다. 추측의 질을 향상시키는 한 가지 방법은 단순히 사용하는 사람이 아니라이를 구현할 사람 (예 : 컨테이너 또는 데이터베이스 공급 업체)의 관점에서 사양을 해석하는 것입니다. 서블릿은 항상 컨테이너 관리 스레드에서 호출되며 이러한 스레드가 둘 이상 있으면 컨테이너가이를 알고 있다고 가정하는 것이 안전합니다. 서블릿 컨테이너는 HttpSession 또는 ServletContext와 같은 여러 서블릿에 서비스를 제공하는 특정 개체를 사용할 수 있도록합니다. 따라서 서블릿 컨테이너는 여러 스레드를 생성하고 ServletContext에 액세스 할 것으로 합리적으로 예상 할 수있는 Servlet.service와 같은 메서드를 호출했기 때문에 이러한 객체에 동시에 액세스 할 것으로 예상해야합니다.
이러한 객체가 유용 할 단일 스레드 컨텍스트를 상상할 수 없기 때문에 사양에서 명시 적으로이를 요구하지 않더라도 스레드로부터 안전하다고 가정해야합니다. 또한 클라이언트 측 잠금이 필요한 경우 클라이언트 코드가 동기화해야하는 잠금은 무엇입니까? 문서는 말하지 않으며 추측하는 것은 어리석은 것 같습니다. 이“합리적인 가정”은 ServletContext 또는 HttpSession에 액세스하고 클라이언트 측 동기화를 사용하지 않는 방법을 보여주는 공식 자습서 및 사양의 예제에 의해 더욱 강화됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다