2013-12-08 5 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, а также:
1> Если я напишу что-нибудь внутри этого оператора if, он отлично работает! , Как:

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"/> 

Что может быть проблема здесь. было бы очень полезно, если кто-нибудь сможет объяснить примеры.


Update: - Даже если я печатать на моей странице после Перенаправление он будет работать, если я использую, если использование заявления после включения заголовка:

<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

@ Масуд благодарю вас за ваш комментарий. Недавно я узнал об этой технологии, поэтому у меня нет большой идеи. Я просто пытаюсь :) –

+0

Попробуйте указать абсолютный путь для отправки метода перенаправления. – anon

ответ

0

Как говорили другие, это не лучший способ достичь того, чего вы хотите достичь.

Таким образом, проблема, которую вы видите, связана с использованием неправильного типа include. Вы используете время запроса (<jsp:include page="..." />), которое обрабатывает включенную страницу и вставляет вывод (если есть) в текущую страницу. Если вы вызываете response.sendRedirect() с включенной страницы, она игнорируется. Следовательно, ваше текущее решение не работает.

Вам нужно будет использовать время перевода (<%@ include file=... %>), которое берет источник включенной страницы, вставляет ее в источник текущей страницы, а затем обрабатывает текущую страницу, как если бы это был отдельный JSP.

0

Из Javadoc:

После использования этого метод, ответ следует считать совершенным и не должен быть написан.

Вы не уважаете это, так как вы продолжаете печатать ответ после sendRedirect().

Основная проблема заключается в вашей архитектуре. JSP - это компоненты просмотра. Они не должны содержать скриптлеты и не должны перенаправляться. Они должны генерировать HTML-разметку из bean-компонентов, хранящихся в атрибутах запроса, контроллером, написанным на Java, как сервлет или действие вашей предпочтительной структуры 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

Спасибо за ваше время. Я пробовал почти все возможное, как положить другие коды в блок else и т. Д., Но я все еще не могу понять, почему это сработало, когда я использовал функцию Redirect после включения, но все же понимаю, что я должен начать изучать MVC и прекратить использовать скриптлеты –

0

Для проверки подлинности используйте фильтры.
Фильтр - это не что иное, как класс Java, который используется для предварительной обработки запроса до его перенаправления на ресурс, который запрашивал пользователь.
Например., если вы сопоставили свой класс фильтра с сервлетом, то по мере поступления запроса для этого сервлета он сначала перехватывается классом фильтра (который содержит ваш код аутентификации), и если ему удастся выполнить аутентификацию, тогда только запрос перенаправляется на сервлет. Это упрощает и упрощает аутентификацию.
Для этого вам необходимо сопоставить свой класс фильтра с сервлетом внутри web.xml.
Короче говоря, response.sendRedirect() не будет служить вашей цели, и вы должны в конечном итоге полагаться на фильтры.

Смежные вопросы