2013-12-18 3 views
0

Java 서블릿에서 리디렉션 문제가 있습니다. 302 대신 Status 401 (Not Authenticated)을 사용하고 싶습니다.Java 서블릿 리디렉션 (상태 401 포함)

URL이 보호 된 리소스가 "/ protected"라고 가정 해 보겠습니다. 이 Url은 ProtectedServlet에 매핑됩니다. ProtectedServlet의 doGet에서 요청이 인증되었는지 아닌지를 확인하고 그렇지 않으면 서블릿이 요청을 Login 페이지로 리디렉션합니다.

ProtectedServlet.java 나는 "WAY1"를 사용한 경우

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException { 

    boolean isAuth = this.checkAuth(); 

    if (isAuth == false) { 

     // WAY1 
     resp.setStatus(401); 
     resp.sendRedirect(resp.encodeRedirectURL(loginUrl)); 

     // WAY2 
     resp.setStatus(401); 
     resp.setHeader("Location", resp.encodeRedirectURL(loginUrl)); 
    } 
} 

결과

  1. 내가, 내가 LOGIN 볼 것 "보호 /"요청할 때, 다음은 내 코드입니다 페이지 하지만 반환 상태는 내가 예상 한대로 302가 아니라 401입니다.

  2. WAY2를 사용하는 경우 : "/ protected"를 요청하면 로그인 페이지가 표시되지 않습니다. 상태가 표시되지 않은 EMPTY 페이지가 표시됩니다.

누구나 내가 뭘 잘못했는지 알아? 감사.

+0

[sendRedirect는 결과 코드를 302로 설정] (http://docs.oracle.com/javaes/7/api/javax/servlet/http/HttpServletResponse.html#sendRedirect%28java.lang.String%29) so 방법 1의 결과를 설명합니다. 방법 2의 경우 브라우저가 오류 코드를 수신 한 후 리디렉션을 따르도록 요구하며, 이것이 작동해야하는지 여부는 알지 못합니다. 방법 1은 당신에게 용납되지 않습니다. – fvu

+0

WAY1은 작동하지만 보호 된 리소스에 액세스하고 있으며 우리가 401 상태를 받아야하므로 인증되지 않았기 때문에 올바른지 생각합니다. 그 맞습니까? – Loc

+0

@Loc SotiriosDelimanolis가 제안하는 것은 실행 가능한 솔루션 일 수도 있고 오류 페이지를 통한 홉 (후자는 사용자가 그러한 종류의 사용자 지원을 요구할 경우 사용자에게 확장 된 지침과 연락처 정보를 제공 할 수 있습니다) – fvu

답변

2

HTTP 프로토콜이 잘 정의되어 있습니다. 클라이언트가 HTTP 요청을 보내고 서버가 HTTP 요청을 다시 보냅니다.

HTTP 응답에는 하나의 상태 코드 만있을 수 있습니다. 옵션 here을 볼 수 있습니다. 즉, 401을 보내서 리디렉션을 수행 할 수 없습니다. Location 헤더를 401 응답에 넣을 수는 있지만 표준이 아니기 때문에 클라이언트에게 처리 방법을 알려야합니다.

리디렉션하는 대신 사용자가 인증되지 않은 경우 401을 반환하고 동일한 로그인 페이지 HTML을 렌더링합니다. 로그인 jsp에 RequestDispatcher#forward(..)을 입력하십시오.

+0

@Loc 천만에요. –

+0

도움 주셔서 감사합니다. –