【问题标题】:How to Solve illegal state Exception in Servelts如何解决 Servlet 中的非法状态异常
【发布时间】:2018-03-16 11:02:35
【问题描述】:

异常跟踪:

""java.lang.IllegalStateException: 响应后无法转发 被承诺 在 org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:328) 在 org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:318) 在 com.zoho.campaign.client.filters.CampaignDomainFilter.doFilter(CampaignDomainFilter.java:140) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 com.zoho.campaign.client.filters.CampaignDefaultFilter.doFilter(CampaignDefaultFilter.java:165) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 com.adventnet.iam.security.SecurityFilter.doFilter(SecurityFilter.java:217) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 com.adventnet.zoho.crmplus.agent.filter.CRMPlusFilter.doFilter(CRMPlusFilter.java:55) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 com.zoho.logs.logclient.filter.AccessLogFilter.doFilter(AccessLogFilter.java:61) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 com.zoho.instrument.InstrumentFilter.doFilter(InstrumentFilter.java:37) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) 在 org.apache.catalina.valves.rewrite.RewriteValve.invoke(RewriteValve.java:480) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 在 org.apache.catalina.authenticator.SingleSignOn.invoke(SingleSignOn.java:240) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) 在 org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) 在 org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) 在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 在 java.lang.Thread.run(Thread.java:745)

当尝试转发 RequestDispatcher 时,我得到了这个异常

出现此问题的原因是什么?

代码:

public void doFilter(ServletRequest req,ServleResponse res,FilterChain filterchain)thorws IOException,Exception
{
String downloaurl="expired";
boolean is_allow_download=false;
HttpServletRequest request=(HttpServletRequest)req;
HttpServletResponse response=(HttpServletResponse)res;
RequestDispatcher rd=null;
if(downloadurl.equals("expired"))
    {
    request.setAttribute("isexpire", "expire");
  }
  else if(downloadurl.equals("no_data"))
     {
       request.setAttribute("isdataAval", false);
  }
     if(url1.contains("export.do") && !downloadurl.equals("no_data") && is_allow_download )
       {
         rdc = request.getRequestDispatcher("users/export.do");
         rdc.forward(request, response);
       }
      rdc = request.getRequestDispatcher("users/closed.do"); 
        rdc.forward(request, response);

}

【问题讨论】:

  • 在此处粘贴您的代码。这是很常见的错误。就是说控制权已经返回,所以没有使用forward()。

标签: java jsp servlets


【解决方案1】:

假设您的堆栈跟踪,您的 RS 在您尝试调用 forward() 方法之前已经提交。您的应用程序已较早返回 RS。

附言请添加一些代码 sn-ps 以获得更多上下文。

【讨论】:

  • @karthik 您的代码会触发 forward() 方法两次。这是错误的方式。只需添加 else 块。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-13
  • 2017-03-06
  • 1970-01-01
  • 2017-08-09
  • 2022-01-08
  • 1970-01-01
相关资源
最近更新 更多