2013-11-09 3 views
3

Я новичок в J2EE и застрял в управлении сеансами. Согласно спецификациям, метод isNew() HttpSession возвращает true, если ранее не было создано идентификатор сеанса от клиента, хранящегося на сервере. Я выполнил следующий код, и метод isNew() не возвращает true даже при первом выполнении. До сих пор я пробовал следующие вещи:Обнаружение нового HttpSession

  1. Удалена история моего браузера (все .. Я пользуюсь Firefox).
  2. Создайте и запустите мое веб-приложение из Netbeans 7.3.1. В этом случае генерируется новый идентификатор сеанса, но метод isNew(), безусловно, не возвращает true.
  3. Перезагрузил компьютер (хотя и был глупым).

Мой вопрос: что мне делать, чтобы выполнить if (session.isNew()) {} блок в коде сервлета (включая любые настройки с браузером и что-то еще)? И что не так с моим кодом?

Вот мой код ниже ..

код для исходного вида :: index.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%> 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 
     <title>JSP Page</title> 
    </head> 
    <body> 
     <h1>Welcome to color selection page</h1> 
     <form method="POST" 
       action="NewPattern"> 
      Select beer characteristics<br> 
       Color: 
       <select name="color" size="1"> 
        <option value="light">light</option> 
        <option value="amber">amber</option> 
        <option value="brown">brown</option> 
       </select> 
       <br> 
       <input type="SUBMIT"> 
     </form> 
    </body> 
</html> 

код для сервлета ::

import java.io.*; 
import javax.servlet.*; 
import javax.servlet.http.*; 
public class NewServlet extends HttpServlet { 
    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     response.setContentType("text/html;charset=UTF-8"); 
     PrintWriter out = response.getWriter(); 
     HttpSession session = request.getSession(); 
     try { 
      out.println("<!DOCTYPE html>"); 
      out.println("<html>"); 
      out.println("<head>"); 
      out.println("<title>Servlet NewServlet</title>");    
      out.println("</head>"); 
      out.println("<body>"); 

      if (session.isNew()) 
       out.println("It is a new session. Session ID: " + request.getSession()); 
      else 
       out.println("It is not a new session. Session ID: " + request.getSession()); 

      out.println("<h1>Got your chosen color " + request.getParameter("color") + "</h1>"); 
      out.println("</body>"); 
      out.println("</html>"); 
     } 
     finally {    
      out.close(); 
     } 
    } 
    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     processRequest(request, response); 
    } 
    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
     throws ServletException, IOException { 
     processRequest(request, response); 
    } 
    @Override 
    public String getServletInfo() { 
     return "Short description"; 
    } 
} 

Код для DD: :

<?xml ...> 
<web-app ...> 
    <servlet> 
     <servlet-name>ServletNew</servlet-name> 
     <servlet-class>NewServlet</servlet-class> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>ServletNew</servlet-name> 
     <url-pattern>/NewPattern</url-pattern> 
    </servlet-mapping> 
</web-app> 
+2

В основном вы используете неправильное решение для функционального требования, которое вы имели в виду. Вы не должны проверять, создан ли сеанс в текущем запросе. Вместо этого проверьте, установлен ли атрибут, а если нет, то он считается «новым» и затем устанавливает атрибут * this *, чтобы последующие запросы могли перехватывать его. – BalusC

ответ

4

Проблема в том, при первом посещении index.jsp, а затем войдите в сервлет.

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

В основном вы можете протестировать свой код, очистив файлы cookie сеансов и откройте сервлет непосредственно в браузере, вручную введя его URL-адрес.

Я также предлагаю установить плагин Firefox «Firebug» с сетевой консолью, где вы можете увидеть каждый запрос на сервер, включая все передаваемые данные. (Еще один отличный плагин - «Панель инструментов веб-разработчиков», которая упрощает очистку только файлов cookie сеансов.)

В зависимости от того, что вы собираетесь достичь, вам нужно либо пересмотреть поток страниц, либо рассмотреть возможность использования веб-сайта как Struts.

+4

JSP * всегда * создавать сеансы, если явно не сконфигурированы, чтобы этого не делать. Чтобы отключить это, вам нужно использовать <% @ page session = "false"%> (или эквивалент). –

-1

Для того, чтобы обнаружить создание нового сеанса необходимо осуществить HttpSessionListener

настроить его в вашем web.xml

<listener> 
    <listener-class>com.my.pack.age.MyHttpSessionListener</listener-class> 
</listener> 

Или аннотированный класс с @WebListener при использовании сервлетов спецификации 3.0

Когда сеанс создается контейнером, он запускает метод sessionCreated, следующий вызов isNew() вернет true.

Чтобы ответить на вопрос - и просто повторите то, что сказал jCoder - сеанс уже создан при вызове JSP. Контейнер сервлета генерирует сервлет для каждого JSP, если вы посмотрите на этот код, вы обнаружите, что вызов getSession() уже происходит там, где уже создан сеанс, если он еще не создан. Когда ваш сервлет затем вызывает метод getSession(), возвращаемый сеанс - это тот, который создан через JSP-сервлет. Следовательно, он всегда возвращается false.

Пример сервлетов фрагмент кода генерируется котом

response.setContentType("text/html; charset=ISO-8859-15"); 
pageContext = _jspxFactory.getPageContext(this, request, response, 
      null, true, 8192, true); 
_jspx_page_context = pageContext; 
application = pageContext.getServletContext(); 
config = pageContext.getServletConfig(); 
session = pageContext.getSession(); // session is created here 
out = pageContext.getOut(); 
_jspx_out = out; 

С фактической конфигурации блок if (session.isNew()){} никогда не будет выполнена. Если вы хотите выполнить некоторые действия при создании сеанса, то либо создайте и настройте прослушиватель сеанса, либо настройте сеанс, чтобы он не создавал видение, как было предложено MarkThomas, так что блок if (session.isNew()){} в вашем сервлете может быть выполнен.

+0

Не отвечает на вопрос. isNew() все еще isNew(). Добавление прослушивателя сеанса не меняет этого. – EJP

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