2014-06-16 9 views
2

Когда я создаю фильтр сервлета в Spring MVC, я получаю следующее исключение.Получение IllegalStateException в методе doFilter

[javax.servlet.ServletException: java.lang.IllegalStateException: Cannot create a session after the response has been committed] with root cause 

, когда я поставил SYSOUT я мог понять, что происходит исключение при переадресации линии, но не понимаю, почему

может кто-нибудь пожалуйста, скажите мне решение этой

SessionFilter. Java

public class SessionFilter implements Filter { 

    private ArrayList<String> urlList; 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String url = request.getServletPath(); 
     boolean allowedRequest = false; 

     if(urlList.contains(url)) { 
      allowedRequest = true; 
     } 

     if (!allowedRequest) { 
      HttpSession session = request.getSession(false); 
      if (null == session) { 
       System.out.println("preparing for redirect"); 
       response.sendRedirect("index.jsp"); 
      } 
     } 

     chain.doFilter(req, res); 
    } 

    @Override 
    public void init(FilterConfig config) throws ServletException { 
     System.out.println("entered init"); 
     String urls = config.getInitParameter("avoid-urls"); 
     StringTokenizer token = new StringTokenizer(urls, ","); 

     urlList = new ArrayList<String>(); 

     while (token.hasMoreTokens()) { 
      urlList.add(token.nextToken()); 

     } 
    } 

web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> 
    <display-name>SpringMVCHibernate</display-name> 

    <welcome-file-list> 
    <welcome-file>index.jsp</welcome-file> 
    </welcome-file-list> 

    <servlet> 
     <servlet-name>dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>dispatcher</servlet-name> 
     <url-pattern>*.do</url-pattern> 
    </servlet-mapping> 

    <session-config> 
     <session-timeout>1</session-timeout> 
    </session-config> 


    <filter> 
     <filter-name>SessionFilter</filter-name> 
     <filter-class>com.common.dao.SessionFilter</filter-class> 
     <init-param> 
      <param-name>avoid-urls</param-name> 
      <param-value>index.jsp</param-value> 
     </init-param> 
    </filter> 

    <filter-mapping> 
     <filter-name>SessionFilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 
: 
: 
: 
+0

Сообщений ПОЛНОГО трассировки стека. –

ответ

6

Для простого и короткого ответа на ваш вопрос:

Чтобы избежать этого, вы должны иметь оператор возврата, или избежать перенаправления или пересылки запроса, или такого рода вещи должен быть сделан последним фильтр в цепочке фильтров.

Для более подробной информации Разъяснения вы можете прочитать ниже:

Это исключение возникает при попытке отправить ответ еще раз, когда ответ уже и продувают пользователь. Пример:

Здесь, в приведенном ниже примере кода, сначала запрос будет перенаправлен на index_test.jsp, и ответ будет очищен пользователем, затем элемент управления снова вернется к фильтру и попытается отправить другой ответ (перенаправление) пользователю, и он потерпит неудачу.

Обычно мы проверяем несколько условий в фильтре и, соответственно, переадресацию и перенаправление, если выполняются два условия, то это создаст проблему.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 

    request.getRequestDispatcher("index_test.jsp").forward(request, response); 
    ((HttpServletResponse)response).sendRedirect("new.jsp"); 
    chain.doFilter(request, response); 
} 

решения для Вашего случая:

Чтобы избежать этого, вы должны иметь оператор возврата, или избежать перенаправления или пересылки запроса, или такого рода вещи должен быть сделан последним фильтром в фильтре цепь.

Таким образом, вы могли бы изменить свой код, как:

public class SessionFilter implements Filter { 

    private ArrayList<String> urlList; 

    @Override 
    public void destroy() { 
    } 

    @Override 
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest request = (HttpServletRequest) req; 
     HttpServletResponse response = (HttpServletResponse) res; 
     String url = request.getServletPath(); 
     boolean allowedRequest = false; 

     if(urlList.contains(url)) { 
      allowedRequest = true; 
     } 

     if (!allowedRequest) { 
      HttpSession session = request.getSession(false); 
      if (null == session) { 
       System.out.println("preparing for redirect"); 
       response.sendRedirect("index.jsp"); 
       return; 
      } 
     } 

     chain.doFilter(req, res); 
    } 

    @Override 
    public void init(FilterConfig config) throws ServletException { 
     System.out.println("entered init"); 
     String urls = config.getInitParameter("avoid-urls"); 
     StringTokenizer token = new StringTokenizer(urls, ","); 

     urlList = new ArrayList<String>(); 

     while (token.hasMoreTokens()) { 
      urlList.add(token.nextToken()); 

     } 
    } 
+0

Надеюсь, вы поймете мой пример. –

+0

Спасибо ........................ –

+0

Но его не работает –

0

свои очевидные права:

System.out.println("preparing for redirect"); 
    response.sendRedirect("index.jsp"); 
    return; 

Мы имеем возвращение после этого заявления. Так что дальнейшее исполнение не произойдет, поэтому вы не получите исключения.

См мы не можем включать как фильтрацию и перенаправление или вперед в том же блоке, что даст IllegalStateException, потому что: этого исключение возникает при попытке отправить ответ еще раз, когда ответ уже и продувают пользователь

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