Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Навигация между JSP


Автор: Hidrag 14.12.2006, 23:38
Хочу сделать навигацию между JSP страницами с передачей параметров методом POST.
Главная страница JSP получает параметры от сервлета, то есть сервлет ее запускает и устанавливает для нее параметры
В полученной JSP я их получаю так:

Код

<% String param1 = (String)request.getAttribute("blabla"); %>


А как теперь мне из этой страницы стартануть другую нажатием на ссылке и передать ей этот же параметр POST методом?

В документации нашел метод:
Код

<%response.sendRedirect("other.jsp?param=value"); %>

Но по моему он не подойдет... передает методом гет, фиг знает как вместо этого value запихнуть значение переменной из директивы...

Автор: Tony 15.12.2006, 00:01
Запехни в сессию. А потом возьми.С лёту не помню. Хотя то 4то ты делаеш - полный изврат(извини).

Автор: tux 15.12.2006, 00:02
Hidrag, Пользуйся кнопочкой "Код".

Вопрос больше в раздел разработки веб-систем. Можно сделать так. Сформировать на странице форму, у которой все атрибуты будут скрытыми (это свои параметры), а ссылка в форме будет показывать на нужную JSP-страницу. Что-то такое:
Код

<form action="page1.jsp" method="post">
    <input type="hidden" name="param1" value="1">
    <input type="hidden" name="param2" value="2">
</form>
<a href="javascript:document.forms[0].submit();">Link</a>


Автор: Hidrag 15.12.2006, 00:08
tux, Спасибо! Кнопкой код пользуюсь обычно, просто поторопился. Завтра попробую!

Автор: Hidrag 15.12.2006, 21:04
К сожалению не то! Работает, но хоть и метод ПОСТ, но все равно можно поглядеть значение переменных если просмотреть исходник из браузера, а это лишает смысла smile 
Опишу ситуацию подробнее
:
В общем у меня есть несколько JSP страниц, полностью одинаковых (копии) отличающиеся только текстовым содержанием. В каждой странице я в самом начале получаю атрибуты:
Код

<% String login = (String)request.getAttribute("Login"); %>
<% String password = (String)request.getAttribute("Password"); %>
<% String status = (String)request.getAttribute("Status");%>

Потом в зависимости от этих параметров что то меняется на странице.

Вопрос в том, как мне из одной страницы стартануть другую и передать ей эти же атрибуты... Желательно передать методом ПОСТ чтобы эти переменные в адресной строке не светились....
сейчас сделал методом ГЕТ:
Код

<a href="Navigation?Login=<%=login%>&Pass=<%=password%>&Status=<%=status%>&Page=store.jsp">Статьи</a><br>


то есть вызываю сервлет Навигатион и ему передаю параметры а он уже стартует страницу которую указал:
Код

request.getRequestDispatcher(page).forward(request, response);

но по моему это как то коряво... вроде через сессию можно, но еще не разобрался как с ними работать 
что подскажете?

Автор: Stampede 15.12.2006, 21:16
Hidrag, ну ясен пень такие вещи нужно делать через сессию. Ну или через кукисы - смотря какая стоит задача. Кто ж логины с паролем гоняет по сети открытым текстом?

Поэтому для начала к тебе встречный вопрос: ты хочешь чтобы юзер логинился каждый раз, когда он заходит (типа как в вебмэйл), и автоматически разлогировался через определенное время (полчаса, к примеру или по закрытию браузера), или ты хочешь, чтобы было по типу как на Винграде, один раз вошел и все, пока сам специально не выйдешь?

В зависимости от этого будем делать либо через сессию, либо через кукисы.

Автор: Hidrag 15.12.2006, 21:33
Вот вот никакой безопасности... (
Я иду по пути меньшего сопротивления, что проще так и делаю соответственно изучая все новое, цель всей задумки: разобраться с JSP и создать интересный динамический ресурс, хостинг уже нашел - зарегал соответствующий. Думаю сначала сделать чтобы логинился каждый раз при входе, а потом добавть опцию в аккаунт, типа поставил галочку - будут кукисы, нет - не будет. Данные пользователя хранятся в БД то есть юзер ввел пароль и логин на странице, эти данные ушли методом ПОСТ сервлету, тот их передал классу ответственному за БД и получить от туда результат, если он положительные то вывел эту же страницу с параметром ( то есть чтобы юзер видел что он зареган и не было полей для ввода логина и паса).

Честно говоря думал это будут разбираться в теме "JSP  с чего начать" но что то она погасла smile

Автор: Greg 15.12.2006, 22:59
Тебя наверное очень волнует тот факт,что аутентификационные данные передаются в открытом виде.
Это самый главный недостаток HTTP и ему попдобных FTP,POP3,Telnet.
Не беспокойся,в этом случае единственное,что может как-то усложнить жизнь взломщику - это 
передача хэша пароля и то не сильно.Что касается сессии или кукисов,то тут кажется вопрос немного не правильно поставлен.Кукисы это реализация способа работы с пользователем,описанная в HTTP.Поэтому работать с пользователем нужно через них.Другое дело,что они могут быть долгоживущими,или сбрасываться по итсечении сессии/таймаута.
"Через сессию" - это наверное было бы изобретением велосипеда,хотя красиво жить не запретишь  smile 

Автор: Stampede 15.12.2006, 23:07
Цитата(Hidrag @  15.12.2006,  11:33 Найти цитируемый пост)
Честно говоря думал это будут разбираться в теме "JSP  с чего начать" но что то она погасла smile


Будет обязательно, если энтузиазм изучающего не утухнет.

По поводу аутентификации: мыслишь в принципе правильно, но есть один нюанс: а ты собираешься код доступа к БД на предмет проверки логина на каждой JSP странице прописывать? Наверное нет, правильно?

Сделать на самом деле можно по-разному, но поскольку ты планируешь сделать строго динамический вебсайт, то имеет смысл (пока что, для простоты) вынести эти действия в фильтр аутентификации. Как оформить фильтр - думаю, разберешься. Результатом его работы должно стать создание объекта User (или как он у тебя называется) и помещение его в сессию. Далее на любой странице к этому объекту можно доступиться в одну строчку.







Автор: Hidrag 15.12.2006, 23:17
За аутентификацию отвечает сервлет он один для всех, ему передал параметры он по базе "пробил" выдал ответ. 
То есть теоретически он должен запихнуть свой результат в сессию, а потом стартануть страницу, эта страница смотрит результаты в сессии если они гуд то выглядит так, если нет то по другому? Я правильно понимаю? Осталось только с сессией научиться работать... как ее создавать или она сама создается, как к ней обращаться(читать/писать) из JSP/Servlet... если подскажете буду признателен, а то чессно говоря утомляет читать документацию от SUN на инглише... хотя все что умею на Java все из нее...

Автор: Greg 15.12.2006, 23:31
Сессия создаётся контейнером,а получить её из сервлета можно так:
Код

HttpSession session =  request.getSession();

Теперь о том как она создаётся:
Контейнер проверяет клиента на наличие парметра jsessionid в кукисах или параметре запроса.
Если найдено,то проверяется значение и связывается с объектом HttpSession именно для этого значения.
Если не найден параметр или его значение ни о чём не говорит контейнеру,то создаётся новая сессия и клиенту посылается кукис с новым jsessionid или добавляется в запрос.

Автор: Stampede 15.12.2006, 23:32
Цитата(Hidrag @  15.12.2006,  13:17 Найти цитируемый пост)
За аутентификацию отвечает сервлет он один для всех, ему передал параметры он по базе "пробил" выдал ответ. 


А, то есть есть какой-никакой MVC? Это оч хорошо. Тогда все вообще тривиально. Как с сессией работать - ну, это мне самому надо в доку лезть. Но да ладно, "если ты такой ленивый...":

Код

// внутри doGet() и т. д.
HttpSession session = request.getSession(true);
User user = (User) session.getAttribute("user");


И фсе!

Запихивать объект User в сессию нужно по обработке POST запроса, приходящего по логину:

Код

// внутри doPost()
String login = request.getParameter("login");
String password = request.getParameter("password");
User user = yourUserLoginDAO.login(login, password);
HttpSession session = request.getSession(true);
if (user != null) {
    session.setAttribute("user", user);


Как доступиться к атрибуту сессии из JSP - надеюсь, сам разберешься.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)