2011-06-13 7 views
1

jsp 로그인 필터를 만들고 싶습니다.jsp 필터, 페이지 이름 얻기

필터해야한다 : 모든 페이지에

  • 차단 요청; 요청 된 페이지가 로그인 페이지 인 경우 요청이 세션이 로그인하지 않은 경우 로그인 세션
  • 의 일부인지 여부를 확인, 그렇지 않으면 루프
  • 것, 리디렉션하지 마십시오 로그인 페이지
  • 에 클라이언트를 리디렉션

덕분에 사전

답변

1

에서 필터의 구현 방식은 (더 코드, 나는 당신이 알고 있으리라 믿고있어 그 전제 조건입니다 서블릿 API) 설명되지 않습니다.

임의의 페이지에 대한 요격 요청. 요청이 로그인 세션

당신은 서블릿 필터를 생성되어야한다의 일부인지 여부를 확인하고 응용 프로그램에 대한 모든 요청이 필터에 의해 차단 될 수 있도록, /*에 대해 매핑. 인증 된 사용자의 추적은 세션 속성을 사용하여 수행되는 것으로 가정합니다. 필터 내의 HttpServletRequest 개체에서 세션을 추출하고 getAttribute() 메서드를 사용하여 특성을 추출 할 수 있습니다.

세션이 기록되어 있지 않은 경우

는, 세션 또는 속성이 존재하지 않는 로그인 페이지

만약에 클라이언트를 리디렉션, 또는 속성이 false, 당신은 리디렉션해야합니다 HttpServletResponse 개체의 sendRedirect() 메서드를 사용하여 로그인 페이지로 이동합니다. 요청 된 페이지가 로그인 페이지 인 경우

, 그렇지 않으면 루프

당신은 요청이 HttpServletRequest의에 대해 getServletPath() 메소드를 사용하여 로그인 페이지에 있는지 여부를 확인할 수 있습니다 것, 리디렉션하지 않습니다 목적.

  • *이 /ApplicationContext/ 디렉토리에서 문서 루트 디렉토리에, 즉 로그인 페이지 및 기타 "공공"의 콘텐츠를 넣어 : 당신이 다음을 수행한다면이 필요하지 않습니다.
  • /ApplicationContext/protected 디렉토리에 보호 된 콘텐츠 (모든 서블릿 매핑 포함)를 넣으십시오.
  • /* 대신 /protected에만 필터를 매핑하십시오. 따라서 필터는 보호 된 리소스에 대한 요청 만 차단합니다. 리소스를 다른 경로에 매핑 할 때는주의하십시오.

* ApplicationContext는 응용 프로그램의 컨텍스트 경로입니다. 귀하의 웹 사이트가 http://example.com/App 일 경우 컨텍스트는 일반적으로 App입니다. 따라서 로그인 페이지는 http://example.com/App/login.jsp이어야하며 보호 된 페이지는 다음과 같이 액세스해야합니다. http://example.com/App/protected/secret.jsp

+0

정답을 주셔서 감사합니다. 1) 왜 속성에 데이터를 "수동으로"저장하는 대신 request.getUserPrincipal()을 사용하지 않습니까? 2) getServletPath()는 "welcome files"(아마도 다른 jsf 경우 ...?)의 경우 실패합니다. 서블릿 이름이 아닌 디렉토리를 반환합니다. – AgostinoX

+0

request.getUserPrincipal() 및 request.getRemoteUser()는 컨테이너 관리자 인증을 위해 작동합니다. 그것을 사용한다면, 세션 속성에 대해 이야기하는 단계를 바꾸십시오. 컨테이너 관리 인증을 사용하지 않고 스키마를 롤백 한 경우 해당 메소드는 null을 리턴합니다. –

+0

getServletPath() 주제에서 특정 시나리오에서 실패합니다. 나는 (당신이 암시 한 것처럼) 디렉토리를 기억하지 않습니다. 그래서 내가 콘텐츠 분리를 제안했습니다. –

1

제한된 페이지를 특정 폴더에 넣으십시오./secured, /app, /private, /admin 등을 사용하고 필터 (또는 컨테이너 관리 보안 제약)를 해당 폴더를 정확하게 다루는 URL 패턴 (예 : /secured/*, /app/*, /private/*, /admin/* 등. 마지막으로 그 폴더 외부에 로그인 페이지를 넣으십시오.

our servlet filter wiki page에는이 사례를 정확하게 다루는 코드 예제가 있습니다.

+0

젠장, 그게 엄청난 꼬리표 야. –