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

(2018.11.12记,有时候try掉没有卵用,比如异步filter前面加200filter,异步filter出错还是500。最好使用下面的方法)

(2019.1.12记,我明白原理了.)


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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
JavaWeb中,可以通过以下方式来实现500异常处理: 1. 使用Servlet的异常处理机制:可以在web.xml文件中配置一个<error-page>元素,指定要处理的异常类型和对应的错误页面。当发生异常时,容器会自动跳转到指定的错误页面进行处理。 示例代码如下: ```xml <error-page> <exception-type>java.lang.Exception</exception-type> <location>/error500.jsp</location> </error-page> ``` 2. 使用Filter过滤器:可以创建一个实现了javax.servlet.Filter接口的过滤器类,在doFilter方法中捕获异常并进行处理。然后在web.xml文件中配置该过滤器,将其映射到需要处理异常的URL路径上。 示例代码如下: ```java public class ExceptionFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { chain.doFilter(request, response); } catch (Exception e) { // 异常处理逻辑 request.getRequestDispatcher("/error500.jsp").forward(request, response); } } // 其他方法省略... } ``` ```xml <filter> <filter-name>ExceptionFilter</filter-name> <filter-class>com.example.ExceptionFilter</filter-class> </filter> <filter-mapping> <filter-name>ExceptionFilter</filter-name> <url-pattern>/your-url-pattern</url-pattern> </filter-mapping> ``` 3. 使用Spring MVC的异常处理器:如果你使用了Spring MVC框架,可以通过编写一个实现了org.springframework.web.servlet.HandlerExceptionResolver接口的异常处理器类来处理500异常。在该类中,你可以定义不同异常类型的处理逻辑,并返回对应的错误页面或错误信息。 示例代码如下: ```java public class CustomExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { ModelAndView modelAndView = new ModelAndView(); modelAndView.setViewName("error500"); // 设置其他错误信息或数据 return modelAndView; } // 其他方法省略... } ``` ```xml <bean id="customExceptionHandler" class="com.example.CustomExceptionHandler" /> ``` 以上是几种常见的实现500异常处理的方式,你可以根据具体的项目需求选择适合的方式进行处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值