GVKun编程网logo

Cannot forward after response has been committed问题(cannot forward to error)

10

这篇文章主要围绕Cannotforwardafterresponsehasbeencommitted问题和cannotforwardtoerror展开,旨在为您提供一份详细的参考资料。我们将全面介绍C

这篇文章主要围绕Cannot forward after response has been committed问题cannot forward to error展开,旨在为您提供一份详细的参考资料。我们将全面介绍Cannot forward after response has been committed问题的优缺点,解答cannot forward to error的相关问题,同时也会为您带来@ResponseBody as the response has already been committed.、Cannot call sendError() after the response、Cannot call sendError() after the response has been committed、Cannot call sendRedirect () after the response has been committed 解决方法的实用方法。

本文目录一览:

Cannot forward after response has been committed问题(cannot forward to error)

Cannot forward after response has been committed问题(cannot forward to error)

Cannot forward after response has been committed问题
try {
						PrintWriter out = response.getWriter();
						//输出
						out.print("用户名或密码错误!");
						//out.flush();
						out.close();
						
					} catch (IOException e) {
						e.printstacktrace();
					}

改了之后就是这样了

try {
						PrintWriter out = response.getWriter();
						//输出
						out.print("用户名或密码错误!");
						//out.flush();
						out.close();
						return;//就是这行
					} catch (IOException e) {
						e.printstacktrace();
					}

@ResponseBody as the response has already been committed.

@ResponseBody as the response has already been committed.

这种情况是 页面跳转 增加了 @ResponseBody 2017-02-16 19:08:09.131 DEBUG [catalina-exec-8][FilterChainProxy.java:200] - /WEB-INF/jsp/page/newsList.jsp has no matching filters 2017-02-16 19:08:09.132 DEBUG [catalina-exec-8][RequestContextFilter.java:104] - Cleared thread-bound request context: org.apache.catalina.connector.RequestFacade@64327ce7 2017-02-16 19:08:09.132 ERROR [catalina-exec-8][ErrorPageFilter.java:204] - Cannot forward to error page for request [/newsList] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

这种情况是页面不存在 2017-02-16 19:14:13.561 ERROR [catalina-exec-2][ErrorPageFilter.java:204] - Cannot forward to error page for request [/newsList] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

    @ResponseBody
    @RequestMapping("/newsList")
    public ModelAndView newsList()
        throws Exception
    {
        LiveNewsInfo newsInfo = new LiveNewsInfo();
       List<LiveNewsInfo> newsList = liveNewsInfoMapper.selectLiveNewsInfoList(newsInfo);
//        newsInfo.setPageNum(pageNum);
//        newsInfo.setPageCount(10);
//      // 页面位置 /WEB-INF/jsp/page/page1.jsp
        ModelAndView mav = new ModelAndView("page/newsList");
        mav.addObject("newsList", newsList);
        return mav;
    }
    
    /**
     * 响应到JSP页面page1
     *
     * @return
     * @author SHANHY
     * @create 2016年1月5日
     */
    @RequestMapping("/page1")
    public ModelAndView page1()
    {
        // 页面位置 /WEB-INF/jsp/page/page1.jsp
        ModelAndView mav = new ModelAndView("page/page1");
        mav.addObject("content", hello);
        return mav;
    }

Cannot call sendError() after the response

Cannot call sendError() after the response

Jersey2+Spring4+Hibernate4测试添加字段,代码如下:

package resource;

import java.util.List;

import javax.annotation.Resource;
import javax.inject.Singleton;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;

import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;

import entity.User;
import service.UserService;;

@Singleton
@Path("user")
@Component // @Repository/@Service/@Controller
public class UserResource {

	@Context
	UriInfo uri;

	@Context
	HttpHeaders header;

	private UserService userService; // Service which will do all data
										// retrieval/manipulation work

	public UserService getUserService() {
		return userService;
	}

	@Resource
	public void setUserService(UserService userService) {
		this.userService = userService;
	}

	
	
	
	// -------------------Create a
	// User--------------------------------------------------------

	@POST
	@Path("/create")
	@Consumes({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML })
	@Produces({ MediaType.TEXT_HTML })
	public Response createUser(User user) {
		System.out.println("Creating User " + user.getName());

		if (userService.exists(user)) {
			System.out.println("A User with name " + user.getName() + " already exist");

			user = userService.getUserByName(user.getName());
			return Response.status(Response.Status.CONFLICT)
			.entity("A User with name " + user.getName() + " already exist")
		        .header("Location", "http://localhost:8080/rest.jerseySpring/user " 
		        + user.getId()).build();

			
		} else {

			userService.add(user);

			return Response.status(Response.Status.CREATED)
			.entity("A new user has been created at /rest.jerseySpring/user/"+ 
			user.getId()).
			header("Location","http://localhost:8080/rest.jerseySpring/user" 
			+ user.getId()).build();
			
		}
	}

	
}

结果当插入有相同名字的user时报错如下:

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed
	at org.apache.catalina.connector.ResponseFacade.sendError(ResponseFacade.java:450)
	at org.glassfish.jersey.servlet.WebComponent.serviceImpl(WebComponent.java:484)
	at org.glassfish.jersey.servlet.WebComponent.service(WebComponent.java:425)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:383)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:336)
	at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
	at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625)
	at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Unknown Source)

根据错误信息

at org.glassfish.jersey.servlet.ServletContainer.service(ServletContainer.java:223)

        在ServletContainer.calss的223行打个断点,debug进去-->WebComponent.class-->ApplicationHandler.class

    -->ServerRuntime.class-->ContainerResponse.class-->OutboundMessageContext.class.class-->URI,发现问题最终出在

这里的str是这里的Location的value,即http://localhost:8080/rest.jerseySpring/user 

header("Location", "http://localhost:8080/rest.jerseySpring/user "

也就是说在解析该字符串时出了问题。那么就是字条串有问题了。我仔细看了半天,发现最后面多了个空格……

当Location的value与@Path("user")所对应的绝对路径有差异时就报错:

java.lang.IllegalStateException: Cannot call sendError() after the response has been committed

所以路径一定要写对了,多一个空格都不行。

Cannot call sendError() after the response has been committed

Cannot call sendError() after the response has been committed

总结

以上是小编为你收集整理的Cannot call sendError() after the response has been committed全部内容。

如果觉得小编网站内容还不错,欢迎将小编网站推荐给好友。

Cannot call sendRedirect () after the response has been committed 解决方法

Cannot call sendRedirect () after the response has been committed 解决方法

<%		
		JudgeName judge = new JudgeName();

		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("userName");
		if (name != null) {
			session.setAttribute("name", name);
			session.setMaxInactiveInterval(30);
		} else {
			response.sendRedirect("index.jsp");
			/* return; */
		}
		String pwd = request.getParameter("pwd");

		if (judge.isExists(name)) {

			if (pwd.equals("12345")) {
				response.sendRedirect("succeed.jsp");
				/*return;*/
			} else {
				session.setAttribute("msg", "密码错误");
				response.sendRedirect("failed.jsp");
				/*return;*/
			}

		} else {
			session.setAttribute("msg", "用户名不存在");
			response.sendRedirect("failed.jsp");
              /*return;*/ } %>

该页面主要实现的功能是对 request 的数据进行对比判断,由 form 表单进入该页面并不会出错,但是由于逻辑混乱导致直接进入页面时会发生两次 response 的重定向,所以报错

逻辑上的错误导致 response 可能被执行两次,两种解决方案:

1. 修改逻辑

2. 在 response 后加 return;

3. 但是不能再最后一个 response 后添加 return;否则报错:

以下为修改后的代码:

<%
		JudgeName judge = new JudgeName();
		request.setCharacterEncoding("utf-8");
		String name = request.getParameter("userName");
		String pwd = request.getParameter("pwd");

		if (name != null && pwd != null) {
			session.setAttribute("name", name);
			session.setMaxInactiveInterval(30);
			
			if (judge.isExists(name)) {
				if (pwd.equals("12345")) {
					response.sendRedirect("succeed.jsp");
					
				} else {
					session.setAttribute("msg", "密码错误");
					response.sendRedirect("failed.jsp");
				}
				
			} else {
				session.setAttribute("msg", "用户名不存在");
				response.sendRedirect("failed.jsp");
			}

		} else {
			response.sendRedirect("index.jsp");
		}
	%>

 

今天的关于Cannot forward after response has been committed问题cannot forward to error的分享已经结束,谢谢您的关注,如果想了解更多关于@ResponseBody as the response has already been committed.、Cannot call sendError() after the response、Cannot call sendError() after the response has been committed、Cannot call sendRedirect () after the response has been committed 解决方法的相关知识,请在本站进行查询。

本文标签: