2013-12-08 4 views
3

설명 할 수없는 sendRedirect 함수에 이상한 문제가 있습니다. 로 나는 header.jsp를 같이 헤더 페이지이 : 내가 는 모든 페이지에서이 헤더 페이지를 포함했다sendRedirect() 함수의 문제점

<%@ page contentType="text/html; charset=iso-8859-1" language="java" import="java.sql.*,java.util.*" errorPage="" %> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<title>Online Exam Portal</title> 
<style type="text/css"> 
    body{ 
     background-color : lightgreen; 
    } 
    </style> 
</head> 
<body> 
<% 
if(session.getAttribute("userid")==null) 
{ 
    response.sendRedirect("signup.html"); 
} 
%> 
<img src="exam_header01.jpg"/> 
<br /> 
Welcome <%=session.getAttribute("userid")+"This is Working"%> 
<a href="ChangePassword.jsp">Change Password</a> 
<a href="logout.jsp">Logout</a> 

<hr/> 

, 난이 유효하지 않은 사용자를 방지하기 위해 원하기 때문에 내가 이런 짓을 세션 및 가입 페이지로 리디렉션하지만 대신 Welcome null과
을 표시합니다.> if 문 내부에 아무 것도 쓰지 않으면 제대로 작동합니다. like :

if(session.getAttribute("userid")==null) 
{ 
    response.sendRedirect("signup.html");//this is not executed 
    out.println("This Runs");//this String is printed 
} 

2> 메인 페이지 (즉, 헤더 페이지 이후)에 동일한 코드를 쓰면 정상적으로 작동합니다.
3> 그리고 내가하여 교체 할 때 가장 중요한 코드는 작동 : 여기에 문제가있을 수 무엇

<jsp:forward page="signup.html"/> 

. 누구나 예제로 설명 할 수 있다면 정말 고맙겠습니다.


업데이트 : - 내가 리디렉션 후 내 페이지를 인쇄 할 경우에도 내가 문을 사용하는 경우 사용하는 경우 그것은 헤더를 포함한 후 작동합니다 javadoc 내에서

<jsp:include page="Header.jsp"/> 
     <%if(session.getAttribute("userid")==null) 
{ 
response.sendRedirect("signup.html"); 
out.println("I cant See this because page is redirected "); 
} 
%> 
    </body> 
</html> 
+1

이것은 인증되지 않은 액세스를 처리하는 방법이 아닙니다. 인증 필터를 대신 사용하십시오. – Masudul

+0

@Masud 귀하의 의견에 감사드립니다. 나는이 기술에 대해 최근에 배웠으므로 나는별로 생각하지 못했다. 나는 단지 시도 중이다 : –

+0

리다이렉트 방법을 보내기위한 절대 경로를 제공한다. – anon

답변

0

다른 사람들이 말했듯이, 이것은 달성하고자하는 것을 달성하는 최선의 방법은 아닙니다.

즉,보고있는 문제는 잘못된 유형의 포함을 사용 한 결과입니다. 요청한 시간 include (<jsp:include page="..." />)를 사용하여 포함 된 페이지를 처리하고 현재 페이지에 출력 (있는 경우)을 삽입합니다. 포함 된 페이지에서 response.sendRedirect()으로 전화하면 무시됩니다. 따라서 현재 솔루션이 작동하지 않습니다.

번역 시간 include (<%@ include file=... %>)를 사용하여 포함 된 페이지의 소스를 가져 와서 현재 페이지의 소스에 삽입 한 다음 단일 페이지 인 것처럼 현재 페이지를 처리해야합니다.

0

:

을이 사용 후 응답이 커밋 된 것으로 간주되어야하며 쓰여서는 안됩니다.

sendRedirect() 이후에 응답을 계속 인쇄하므로이 내용을 존중하지 마십시오.

주요 문제는 아키텍처에 있습니다. JSP는보기 구성 요소입니다. 스크립틀릿을 포함하면 안되며 리디렉션해서는 안됩니다. 자바로 작성된 컨트롤러에 의해 요청 속성에 저장된 bean으로부터 HTML 마크 업을 생성해야한다. 선호하는 MVC 프레임 워크의 서블릿이나 액션이다. 그리고이 마크 업을 생성하려면 JSP EL, JSTL 및 기타 사용자 정의 태그 만 사용해야합니다.

오류가 발생하기 쉽고 반복적 인 모든 JSP에서 로그인 검사를 반복하는 대신 모든 요청을 가로 채어 확인하고 다음 구성 요소 (컨트롤러)가 해당 요청을 처리하도록하는 서블릿 필터가 있어야합니다 사용자의 작업이 인증됩니다.

request --> authentication filter --- if authenticated ---> controller --- forward to ---> JSP 
        | 
        |--- if not authenticated --- redirect to --> authentication controller --- forward to ---> login.jsp 
+0

아직도 이해할 수없는 이유는 메인 페이지 (예 : 헤더를 포함한 후) 및 응답 후 인쇄 된 예제 내에서 검사를 위해 심지어 내가 그 성명 그것의 작동하지 않습니다 : ( –

+0

페이지의 나머지 부분 (환영합니다 ... 페이지 끝까지)은 'else'블록의 일부가 아니기 때문에 인쇄됩니다. 왜 포함되어 있지 않을 때 작동하지 않습니다 페이지는 아마 Tomcat의 결함으로 인해 발생하지만, 그렇게하지 말아야합니다. 로그인 확인 이전의 텍스트도 이미 인쇄되었으므로주의해야합니다. MVC 사용 –

+0

시간을내어 감사합니다. 나는 다른 블록에 다른 코드를 넣는 것처럼 가능한 거의 모든 노력을했으나 아직도 이해할 수 없다. 왜 내가 리다이렉트 함수를 사용했는지 아직도 이해하지 못했지만, 여전히 MVC를 배우고 사용을 중지해야하는 1 가지를 이해한다. 스크립틀릿 –

0

인증을 위해 필터를 사용하십시오.
필터는 사용자가 요청한 리소스로 전달되기 전에 요청을 사전 처리하는 데 사용되는 Java 클래스입니다.
예. 서블릿으로 필터 클래스를 매핑 한 다음이 서블릿에 대한 요청이 들어 오면 요청은 필터 클래스 (인증 코드 포함)에 의해 가로 채어지고 인증에 성공하면 요청 만 서블릿으로 전달됩니다. 따라서 인증이보다 쉽고 유연 해집니다.
이렇게하려면 필터 클래스를 web.xml의 서블릿과 매핑해야합니다.
간단히 말해서 response.sendRedirect()는 목적에 부합하지 않을 것이므로 궁극적으로 필터를 사용해야합니다.