2010-07-29 2 views
2

PHP에서 i는 사용자가 로그인했는지 여부를 인증하는 데 사용되며, ok로 설정하면 구성원 ID에 대한 세션을 확인하여 페이지가 헤더를 통해 로그인 페이지로 리디렉션됩니다. 이 인증 스크립트는 auth.php에 있었고 나는 로그인이 필요한 페이지에이 스크립트를 포함 시켰습니다. 단순한. 그러나 나는 JSP로 같은 일을 할 수 없다. auth.jsp를 포함하는 나머지 페이지는 auth.jsp가 무엇을 하든지 상관없이로드되기 때문입니다. auth.jsp는 사용자가 로그인하지 않은 경우 로그인 페이지 아래의 원본 페이지를 계속 볼 수있는PHP에서 PHP의 헤더와 동등한 PHP

<% 
UserService userService = UserServiceFactory.getUserService(); 
User user = userService.getCurrentUser(); 
if (user == null) { 
%> 
<jsp:forward page="/index"/> 
<% 
return; 
} 
%> 

입니다. 이 때문에 수동으로 모든 페이지에서 다른 사람이 사용하는 경우 매우 불편한 검사를 포함시켜야합니다. 모든 솔루션 ?? 포함 페이지는

<jsp:include page="auth.jsp" /> 
<p>Welcome</p> 

답변

1

최소한 사용자 정의 Servlet Filter를 작성할 수 있습니다. 요청이있을 때마다 호출되며 아무 것도하지 않아도됩니다.

또한 컨테이너 수준 보안 또는 심지어 보안과 같은 것을 조사 할 수 있습니다. 둘 다 당신을 위해 이것을 처리합니다.

편집 :

아무런 문제가 없습니다. 그 동안

, 당신은 아마의 당신이 사용하는지와 같은 일종의 종류의 같은

response.addHeader("location", "/login.jsp"); 

인 auth.jsp

<% 
    if (user == null){ 
    response.sendRedirect(redirectURL); 
    } 
%> 

이 뭔가를하고 싶어 PHP로.

+0

체크 아웃 : http://www.developer.com/security/article.php/3467801/Securing-J2EE-Applications-with-a-Servlet-Filter.htm – Derrick

+0

은 컨테이너 수준의 보안을 조사 할 것이며, 봄 보안. java를 처음 사용합니다. – abel

+0

위의 수정 사항을 확인하십시오. 이것은 아마도 PHP에 익숙했던 것과 더 가깝습니다. – Derrick

1

servlet filter은 분명히 당신이 찾고있는 것입니다. container managed 또는 spring security을 잡을 수도 있지만 지식이 있으면 적절한 파악을하기에는 너무 먼 단계 여야합니다.

if (UserServiceFactory.getUserService().getCurrentUser() != null) { 
    chain.doFilter(request, response); // User is logged in, just continue request. 
} else { 
    ((HttpServletResponse) response).sendRedirect("/login.jsp"); // Not logged in, show login page. You can eventually show the error page instead. 
} 

지도 당신이 인증하고자하는 페이지를 취재 url-patternweb.xml에서이 필터 :

여기 필터의 doFilter() 방법과 같이 방법을 기본적인 예입니다. 예 : /secured/*, /private/*, /authenticated/* 등, 그리고 모든 JSP를 (로그인 페이지의 기대!) 같은 폴더에 놓습니다.


JSP에서 오류가 발생하는 이유는 응답이 이미 커밋되었을 때 발생할 수 있습니다. 서버 로그를 읽은 경우 <jsp:forward> 지점에서 IllegalStateException: Response already committed을 호출해야합니다. PHP에서 작동하는 이유는 아마도 응답 버퍼가 더 크기 때문이거나 응답 바디의 어느 부분보다 우연히 우연히 호출되어 로직이 <!DOCTYPE> 앞에 있기 때문입니다. 응답이 커밋되지 않는 한 앞으로 또는 리디렉션을 사용하여 대상을 변경할 수 있습니다.

+0

감사합니다.실제로, Filter의 부분을 파악하고 작업 코드를 작성하는 데 한 시간 이상 걸렸습니다. 내 첫 번째 질문은 오류 페이지에 연결하는 대신 로그인 페이지로 리디렉션하는 것과 관련되어있었습니다. 나는 자바를 먼저 배워야한다. 그러나 나는 책을 협박하는 것을 안다. – abel