欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

提交响应后无法转发错误

程序员文章站 2022-03-06 18:37:41
问题描述:浏览器显示HTTP状态500-内部服务器错误:控制台提示:Stacktrace:java.lang.IllegalStateException: 提交响应后无法转发监听器中权限判断代码:package com.ptu.blog.filter;import java.io.IOException;import javax.servlet.DispatcherType;import javax.servlet.Filter;import javax.servlet.Filte...

问题描述:

浏览器显示HTTP状态500-内部服务器错误:
提交响应后无法转发错误

控制台提示:
Stacktrace:
java.lang.IllegalStateException: 提交响应后无法转发
提交响应后无法转发错误

监听器中权限判断代码:

package com.ptu.blog.filter;

import java.io.IOException;
import javax.servlet.DispatcherType;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet Filter implementation class AccessFilter
 */
@WebFilter(dispatcherTypes = {DispatcherType.REQUEST }
					, urlPatterns = { "/dashboard/*","/us.do?back=back","/bs2.do?back=back" })
public class AccessFilter implements Filter {

    /**
     * Default constructor. 
     */
    public AccessFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		// place your code here
		System.out.println("AccessFilter doFilter");
		HttpServletRequest req = (HttpServletRequest)request;
		HttpServletResponse res = (HttpServletResponse)response;
		
		
		 if(req.getSession().getAttribute("user")==null){
			// 如果用户未登录 跳转至登录页面
			
			//out.print(session.getAttribute("user"));
			res.sendRedirect("../login.jsp");
			//重定向以后 再进行转发有极大可能抛出异常 需要加return
			return ;
			
		} 
	
		// pass the request along the filter chain
		chain.doFilter(request, response);
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}


原因分析:

初学者之间常见的误解是,他们认为forward()sendRedirect()sendError()的调用会奇迹般地退出并“跳出”方法块,因此忽略了代码的剩余部分。 例如:

 protected void doPost() { if (someCondition) { sendRedirect(); } forward(); 
 // This is STILL invoked when someCondition is true! } 

这实际上是不正确的。 当然,它们的行为与其他任何Java方法(当然期望System#exit()当然)不一样。 当上面例子中的someCondition为true在同一个请求/响应中的sendRedirect()sendError() forward()之后调用forward(),将有机会得到exception:

java.lang.IllegalStateException:提交响应后无法转发

如果if语句调用forward() ,然后调用sendRedirect()sendError() ,则会抛出以下exception:

java.lang.IllegalStateException:在提交响应之后无法调用sendRedirect()


解决方案:

该文章中就是在权限监听器AccessFilter中res.sendRedirect("../login.jsp")之后添加return

res.sendRedirect("../login.jsp");
//重定向以后 再进行转发有极大可能抛出异常 需要加return
return ;

其他解决方案分析

要解决这个问题,你需要添加一个return; 之后的声明

 protected void doPost() { if (someCondition) { sendRedirect(); return; } forward(); } 

…或者引入一个else块。

 protected void doPost() { if (someCondition) { sendRedirect(); } else { forward(); } } 

要在代码中find根本原因,只需search任何调用forward()sendRedirect()sendError()而不退出方法块或跳过代码的剩余部分的行。 这可以在特定代码行之前的同一个servlet中,也可以在特定servlet之前被调用的任何servlet或filter中。

sendError()情况下,如果您的唯一目的是设置响应状态,请改用setStatus()

另一个可能的原因是servlet在调用forward()时写入响应,或者以相同的方法调用。

 protected void doPost() { out.write("some string"); // ... forward(); // Fail! } 

响应缓冲区大小在大多数服务器中默认为2KB,所以如果写入超过2KB,它将被提交, forward()将以同样的方式失败:

java.lang.IllegalStateException:提交响应后无法转发

解决scheme是显而易见的,只是不写入到servlet中的响应。 这是JSP的责任。 你只需像request.setAttribute("data", "some string")那样设置一个request属性,然后在JSP中打印它,就像${data}。 另请参阅我们的Servlet wiki页面 ,了解如何正确使用Servlet。

参考链接:https://www.dovov.com/java-lang-illegalstateexceptionredirectbuild.html

本文地址:https://blog.csdn.net/weixin_46069058/article/details/111938238

相关标签: jsp java filter