javaweb怎麼在爆異常500的情況下返回狀態碼200

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),判斷是首次進入異常處理器,如果是首次進入,那麼就轉發過去,如果不是首次,那麼就不轉發或者其他.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章