java.lang.IllegalStateException при попытке навигации между двумя приложениями Java EE - PullRequest
0 голосов
/ 20 января 2012

В основном у меня есть корпоративное приложение jsf, которое показывает некоторые сервисы пользователю.

Различные отделы предприятия размещают разные приложения на одном веб-сервере, и в нашем приложении предоставляются ссылки для доступа к ним.

У меня есть Servlet с именем RedirectServlet в моем приложении, через который я перенаправляю все запросы в разные приложения. Ниже приведен мой redirectservlet

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        LOGGER.debug("In doGet()");
        try{
            if(request.getParameter("URL") != null){
                LOGGER.debug("URL Found redirecting forward");
                String redirectUrl = request.getParameter("URL"); 
                response.sendRedirect(redirectUrl);
            }
        }catch(NullPointerException e){
            LOGGER.debug("URL not found setting new session parameters & redirecting forward");
            HttpSession session = request.getSession(true);
            try {
                response.sendRedirect(properties.getProperty(REDIRECTURL, true));
            } catch (Exception e1) {
                LOGGER.debug("Expcetion with propertiesfile: ",e1);
            }
        }
    }

Что я делаю выше, это если щелкнуть ссылку (Параметр URL присутствует) я перенаправляю на конкретное приложение, в противном случае я просто создаю новый сеанс своего приложения и перенаправляю на домашнюю страницу приложения.

когда пользователь выходит из любого другого приложения, я перенаправляю обратно на свое приложениеВот как я перенаправляю обратно к своему приложению

public void Logout(){
        LOGGER.debug("In LogOut");
        try
        {
            HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
            HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
            HttpSession session = req.getSession(false);
            LOGGER.debug("report session id:" + session.getId());
            res.sendRedirect(REDIRECTURL);
            session.invalidate();
        }catch(IllegalStateException e){
            LOGGER.debug("Exception in LogOut", e);
        }
        catch (IOException e){
            LOGGER.debug("Exception in LogOut", e);
        }
    }

Я получаю следующее сообщение об ошибке сервера в строке res.sendRedirect в приведенном выше коде

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: Cannot forward after response has been committed
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:221)
root cause

java.lang.IllegalStateException: Cannot forward after response has been committed
    org.apache.myfaces.context.servlet.ServletExternalContextImpl.dispatch(ServletExternalContextImpl.java:368)
    org.apache.myfaces.trinidad.context.ExternalContextDecorator.dispatch(ExternalContextDecorator.java:44)
    org.apache.myfaces.trinidad.context.ExternalContextDecorator.dispatch(ExternalContextDecorator.java:44)
    org.apache.myfaces.trinidadinternal.context.FacesContextFactoryImpl$OverrideDispatch.dispatch(FacesContextFactoryImpl.java:267)
    org.apache.myfaces.view.jsp.JspViewDeclarationLanguage.buildView(JspViewDeclarationLanguage.java:94)
    org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:66)
    org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
    javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)

Вот как мыуправление сеансом между приложениями

Когда пользовательПри первом входе в наше приложение мы сохраняем некоторые данные в БД, и после этого каждое приложение проверяет эти данные в БД.

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

Оба приложения используют JSF 1.2 и Apache Trinidad .

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012

Вышеуказанное исключение исчезло, когда я добавил следующую строку в метод Logout () выше

FacesContext.getCurrentInstance().responseComplete();

Вот мой модифицированный метод Logout ()

public void Logout(){
        LOGGER.debug("In LogOut");
        try
        {
            HttpServletRequest req = (HttpServletRequest)FacesContext.getCurrentInstance().getExternalContext().getRequest();
            HttpServletResponse res = (HttpServletResponse)FacesContext.getCurrentInstance().getExternalContext().getResponse();
            HttpSession session = req.getSession(false);
            LOGGER.debug("report session id:" + session.getId());
            session.invalidate();
            res.sendRedirect(REDIRECTURL);
            FacesContext.getCurrentInstance().responseComplete();
        }catch(IllegalStateException e){
            LOGGER.debug("Exception in LogOut", e);
        }
        catch (IOException e){
            LOGGER.debug("Exception in LogOut", e);
        }
    }
0 голосов
/ 23 января 2012
session.invalidate();
res.sendRedirect(REDIRECTURL);

Попробуйте это.Это может решить вашу проблему.

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