javaweb怎么在爆异常500的情况下返回状态码200

版权声明:本文为博主原创文章,未经博主允许不得转载。你想转载请附加连接哦 https://blog.csdn.net/dmw412724/article/details/82559352

javaweb报异常一般是返回状态码500,那如何去返回200呢?

比如我像返回{code:-1,msg:"系统异常"},用springmvc的异常处理器是返回状态码是500.我想返回200

对于http请求来说,答案就是使用HttpServletResponse.setStatus(200);

我们试一下:

1.在springmvc的统一异常处理器里HandlerExceptionResolver里set一下

发现没有用.最终返回浏览器还是500

打印一下,发现就是状态码就是200啊.怎么浏览器里接到的是500呢?

2.在springmvc的拦截器里的handlerIntegerceptor里的after方法里面

打印一下,发现还是200,set一下,发现没有用.

3.在filter里试试

@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletResponse res =(HttpServletResponse) response;
		chain.doFilter(request, res);
		System.out.println(res.getStatus());
	}

结果,如果报了异常,则根本不打印.且浏览器那里还是500,

那就try一下

@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletResponse res =(HttpServletResponse) response;
		try {
			chain.doFilter(request, res);
		} catch (Exception e) {
			System.out.println("状态码:"+res.getStatus());
			
		}
	}

发现打印的还是200.但是浏览器那里变了,变成了200

推测异常最终抛到tomcat里,tomcat发现如果有异常且返回码是200,则设置返回码是500(如果爆了异常,设置了其他异常返回码,比如是404,那么Tomcat并不会去修改返回码,好像他只针对200是吗?).所以只要爆了异常在内部设置200是没有用的.因为最终tomcat还是会set500的.所以用过滤器try掉异常,那么200就会返回200.否则200就会返回500

4.过滤器是个好方法.但也可以这样做.

在HandlerExceptionResolver进行转发到正常的@Requestmapping映射里,这时候就是返回码200了.因为那个异常已经不会上抛了.

比如:request.getRequestDispatcher("/ex").forward(request, response);那么异常就会就去/ex里了.在里面处理一些东西.

但这个要注意,如果ex里由于操作不当,也抛了异常,那就会循环调用,最终导致栈溢出.解决办法.设置request.setAttrbute(fist),判断是首次进入异常处理器,如果是首次进入,那么就转发过去,如果不是首次,那么就不转发或者其他.

猜你喜欢

转载自blog.csdn.net/dmw412724/article/details/82559352