2013-08-18 3 views
0

Я делаю проект с использованием структуры MVC, где я создал сеанс на нескольких страницах, и на каждой странице отображается анкерный тег (logout), где он перенаправляет пользователя на первую страницу (Страница авторизации). То, что я пытаюсь сделать, - это когда пользователь перенаправляется на страницу входа в систему, он проверяет, существует ли уже существующий сеанс, если «да», а затем сеанс Invalidate, и пользователь должен снова войти в систему. Но мой код не работает после аннулирования сеанса, когда я нажимаю кнопку «Отправить», не заполняя имя пользователя/пароль, которое по-прежнему занимает старое значение ... скажите, пожалуйста, куда я иду?Как сделать недействительным сеанс в jsp

  <jsp:useBean id="theBean" class="pack.java.MyModel"/> 
     <jsp:setProperty name="theBean" property="name" param="userName"/> 
     <jsp:setProperty name="theBean" property="pass" param="userPass"/> 
     <%@ taglib uri="/WEB-INF/jsp2/taglib1.tld" prefix="easy" %> 
     <html> 
     <head> 

     </head> 
     <body > 
     <form method="post"> 
     <h1>Login please</h1> 
     Enter username : <input type = text name = userName > 
      </br> 
     Enter password : <input type = password name = userPass > 
     </br> 
     <input type = submit name = submit value = submit> 
     </br> 
     <% 

      HttpSession session=request.getSession(false); 

     if(session!=null) 
     { 
      session.invalidate(); 
     } 
      String btn = request.getParameter("submit"); 
     if(btn!=null) 
     { 
     %> 

     <easy:myTag/> 
     <% 

     } 
     %> 
    </form> 
    </body> 
</html> 
+0

Почему вы используете скрипты? http://stackoverflow.com/questions/3177733/how-to-avoid-java-code-in-jsp-files?rq=1 – adarshr

+0

Я использую пользовательский тег, поэтому .. – Gaurav

+0

Это не очень хорошая причина для написания 'session.lnvalidate()' в JSP. Напишите выделенный сервлет, который делает invalidate и просто вызовите ссылку на него в JSP. Если вы действительно хотите удостовериться, что пользователь вышел из системы, прежде чем он попытается войти в систему, напишите фильтр, который сделает это, и подключите его поток. – adarshr

ответ

1

Это зависит от структуры

код

<% 
session.invalidate(); 
%> 

недействительным сессии, но что: делает "легко MyTag"?

pute сеанс недействителен на отдельной странице; если он работает, вам нужно исследовать пользовательский тег myTag.

+0

Да Я использую пользовательский тег, и что вы имеете в виду, поставив сессию на страницу недействительной? причина, по которой я использую сеанс invalidate на этой странице, заключается в том, что всякий раз, когда пользователь приходит на эту страницу, он должен каждый раз входить в систему ... пожалуйста, объясните, что именно я должен делать. – Gaurav

+0

Общее описание сеанса недействительным работает, но это зависит от жизненного цикла страницы. Во-первых, если вы используете службу проверки подлинности J2EE, вы не можете вызвать страницу входа в систему напрямую, но вы выполняете logaout на отдельной странице, а затем перенаправляете пользователя на главную страницу. Затем контейнер проверяет пользователя, и если он не аутентифицирован, он перенаправляется на страницу входа. Этот жизненный цикл описан там http://docs.oracle.com/javaee/6/tutorial/doc/glxce.html – venergiac

0

Ваша проблема заключается в том, что вы вызываете недействительный путь после заголовка ответа. Когда jsp был преобразован в сервлет, код html находится перед этими строками команд. Попробуйте положить его перед тегом <hmtl>.

За кулисами, система извлекает идентификатор пользователя из куки или прикрепленных данных URL, а затем использует этот идентификатор в качестве ключа в таблицу ранее созданных объектов HttpSession. Но это все сделано прозрачно программисту: вы просто вызываете getSession. Если идентификатор сеанса не найден во входящем файле cookie или в прикрепленной информации URL, система создает новый пустой сеанс. И, если используются файлы cookie (ситуация по умолчанию), система также создает исходящий cookie с именем JSESSIONID с уникальным значением, представляющим сеанс ID. Таким образом, хотя вы вызываете getSession по запросу, вызов может влиять на ответ. Следовательно, вам разрешено вызывать request.getSession только в том случае, если было бы законно устанавливать HTTP-ответ заголовки: до отправки какого-либо документа (т. Е. Покрашено или ) клиенту.

Как указано в этом файле: http://www.java-programming.info/tutorial/pdf/csajsp2/08-Session-Tracking.pdf

с этого сайта: http://courses.coreservlets.com/Course-Materials/csajsp2.html

Для получения более общей информации:

Отбросив данных сессии

Когда вы сделано с помощью пользователя ионных данных, у вас есть три варианта.

• Удалите только данные, созданные вашим сервлетом. Вы можете вызвать removeAttribute («ключ»), чтобы отбросить значение, связанное с указанным ключом . Это наиболее распространенный подход.

• Удалить весь сеанс (в текущем веб-приложении).Вы можете использовать , чтобы отменить весь сеанс. Просто помните, что выполнение приводит к потере всех данных сеанса пользователя, а не только данных сеанса , созданных вашей страницей сервлета или JSP. Таким образом, все сервлеты и JSP-страницы в веб-приложении должны согласовывать случаи , для которых может вызываться invalidate.

• Выйдите из системы и удалите все сеансы, принадлежащие ему или ей. Наконец, на серверах, поддерживающих сервлеты 2.4 и JSP 2.0, вы можете вывести log, чтобы вывести клиента из веб-сервера и аннулировать все сеансы (не более одного для каждого веб-приложения), связанные с этим пользователем. Опять же, поскольку это действие касается сервлетов, отличных от ваших собственных, обязательно , чтобы скоординировать использование команды выхода с другими разработчиками на на вашем сайте.