如何自定义HTTP 状态响应码(response code)

本文详细介绍了HTTP状态响应码的五大类别及其含义,包括信息化响应、成功响应、重定向消息、客户端错误及服务器端错误。探讨了自定义状态响应码的必要性,以及在Java和JavaScript中实现自定义状态码的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、什么是HTTP 状态响应码/都有哪些状态响应码? 
   来自于Mozilla基金会网站的关于HTTP状态码的文章(https://developer.mozilla.org/zh-TW/docs/HTTP/Response_codes)指出HTTP状态码分为5大类,分别代表: 
1xx  信息化响应 (ps: http1.1之前是保留区段,HTTP1.1规定了2项) 
2xx  成功响应 
3xx  重定向消息 
4xx  客户端错误 
5xx  服务器端错误 

二、为什么要自定义状态响应码? 
    既然HTTP规范已经定义了这么多状态响应码,我们自定义状态响应码有什么用处呢? 
目前HTTP规范定义的响应码,各大应用服务器和浏览器厂家都已经实现了这些内容,可以根据请求响应的不同结果返回不同的状态码,浏览器接收到这些状态码后也会做出响应的动作和操作。 
我们可以通过自定义的状态响应码,对系统做一下通用的提示,例如当发生某一类问题时,可以通过状态响应码,由系统底层统一给出提示。另外,ajax请求也可以自定义响应码,前端进行判断后进行不同的处理。 

三、自定义状态码的实现 

Java代码 

int myCode=601;  
response.setResponseCode(myCode);  
request.setAttribute("javax.servlet.error.status_code",myCode);  


如果使用了spring框架,也可继承SimpleMappingExceptionResolver,调用它的 

Java代码 

applyStatusCodeIfPossible(requset,response,code)  

方法。 
四、自定义状态码的应用 

Javascript代码 

 

ajaxError(function(event,xhr,options.exc){  
   if(xhr.status=='601'){  
    dosomething();  
   }   
 });  

 

<think>在JavaFilter中设置自定义HTTP状态码可以通过HttpServletResponse对象实现。以下是具体步骤:###解决方案1.**获取HttpServletResponse对象**:在doFilter方法中将ServletResponse强制转换为HttpServletResponse2.**设置状态码**:使用`setStatus(intsc)`方法设置自定义状态码3.**可选:设置响应内容**:如果需要返回错误信息,可以写入响应体###代码示例```javapublicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{HttpServletRequesthttpRequest=(HttpServletRequest)request;HttpServletResponsehttpResponse=(HttpServletResponse)response;try{//业务逻辑判断if(/*满足某些错误条件*/){//设置自定义状态httpResponse.setStatus(499);//使用自定义状态码//可选:返回JSON错误信息httpResponse.setContentType("application/json");httpResponse.setCharacterEncoding("UTF-8");StringerrorJson="{\"error\":\"自定义错误描述\"}";httpResponse.getWriter().write(errorJson);return;//注意直接返回,不再继续执行过滤器链}//正常情况继续执行过滤器链chain.doFilter(request,response);}catch(Exceptione){//异常处理(可设置500状态码)httpResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);httpResponse.getWriter().write("{\"error\":\"服务器内部错误\"}");}}```###关键点说明1.**状态设置位置**:在需要返回错误的位置调用`httpResponse.setStatus(int)`2.**响应终止**:设置状态码后立即`return`,避免继续执行过滤器链3.**内容类型**:设置`Content-Type`确保客户端正确解析响应体4.**异常处理**:捕获异常时同样可设置状态码(如500)###高级场景:统一错误处理结合引用[2][^2]和引用[3][^3],可通过以下方式优化:```java//自定义错误处理工具类publicclassFilterErrorHandler{publicstaticvoidsendError(HttpServletResponseresponse,intstatus,Stringmessage){try{response.setStatus(status);response.setContentType("application/json");Stringjson=newObjectMapper().writeValueAsString(Map.of("status",status,"message",message));response.getWriter().write(json);}catch(IOExceptione){//日志记录}}}//在过滤器中使用publicvoiddoFilter(...){//...if(invalidToken){FilterErrorHandler.sendError(httpResponse,499,"无效令牌");return;}//...}```###注意事项1.**HTTP规范**:自定义状态码应避免与标准状态码冲突(建议使用4xx/5xx范围)2.**多次调用**:`setStatus()`方法会覆盖之前设置状态码3.**响应提交**:在调用`getWriter()`或`getOutputStream()`后设置状态码可能无效###常见状态码示例|状态码|含义|设置方法||--------|---------------------|---------------------------------------||400|错误请求|`httpResponse.setStatus(400)`||401|未授权|`httpResponse.sendError(401)`||403|禁止访问|`httpResponse.setStatus(403)`||499|自定义客户端错误|`httpResponse.setStatus(499)`|>注意:`sendError()`方法会触发容器默认错误页,而`setStatus()`允许自定义响应体[^2]###相关问题1.如何在SpringBoot中全局处理Filter抛出的异常?2.自定义HTTP状态码的最佳实践是什么?3.如何确保过滤器中的状态设置不影响后续过滤器执行?</think>### 在 Java Filter 中设置自定义 HTTP 状态码 在 Java Filter 中返回自定义 HTTP 状态码的核心方法是使用 `HttpServletResponse` 对象的 `setStatus()` 方法。以下是完整实现方案: #### 基础实现 ```java public class CustomStatusFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; HttpServletResponse httpResponse = (HttpServletResponse) response; try { // 1. 业务逻辑检查(示例) String authToken = httpRequest.getHeader("Authorization"); if (authToken == null || authToken.isBlank()) { // 2. 设置自定义状态码(499 示例) httpResponse.setStatus(499); // 自定义状态码 // 3. 返回自定义响应体 httpResponse.setContentType("application/json"); String jsonResponse = "{\"code\":499,\"message\":\"Missing authorization token\"}"; httpResponse.getWriter().write(jsonResponse); return; // 终止过滤器链 } // 4. 正常情况继续执行 chain.doFilter(request, response); } catch (Exception e) { // 5. 异常处理(设置500状态码) httpResponse.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); httpResponse.getWriter().write("{\"error\":\"Internal server error\"}"); } } } ``` #### 关键点说明 1. **设置状态码**: ```java httpResponse.setStatus(499); // 设置自定义状态码 ``` 支持任意整数(建议使用 4xx/5xx 范围内的非标准码) 2. **返回响应内容**: ```java httpResponse.setContentType("application/json"); httpResponse.getWriter().write("{\"error\":\"Description\"}"); ``` 3. **终止请求**: 设置状态码后立即 `return`,避免继续执行过滤器链 #### 高级用法:统一错误处理 结合引用[2][^2]和引用[3][^3],实现更健壮的错误处理: ```java public class ErrorHandlingFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException { HttpServletResponse httpResponse = (HttpServletResponse) response; try { // 业务逻辑检查 if (!checkRequestValid((HttpServletRequest) request)) { sendErrorResponse(httpResponse, 480, "Invalid request parameters"); return; } chain.doFilter(request, response); } catch (CustomBusinessException e) { sendErrorResponse(httpResponse, e.getErrorCode(), e.getMessage()); } catch (Exception e) { sendErrorResponse(httpResponse, 500, "System error"); } } private void sendErrorResponse(HttpServletResponse response, int code, String message) throws IOException { response.setStatus(code); response.setContentType("application/json"); JsonObject errorJson = new JsonObject(); errorJson.addProperty("status", code); errorJson.addProperty("message", message); errorJson.addProperty("timestamp", Instant.now().toString()); response.getWriter().write(errorJson.toString()); } } ``` #### 配置说明(web.xml) ```xml <filter> <filter-name>statusFilter</filter-name> <filter-class>com.example.CustomStatusFilter</filter-class> </filter> <filter-mapping> <filter-name>statusFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` #### 注意事项 1. **状态码范围**: - `1xx`:信息响应 - `2xx`:成功 - `3xx`:重定向 - `4xx`:客户端错误(推荐自定义码使用此范围) - `5xx`:服务器错误 2. **标准码优先**: 优先使用标准 HTTP 状态码(如 400、401、403 等) 3. **响应提交时机**: 设置状态码必须在获取 `Writer`/`OutputStream` 之前,否则可能失效 4. **与容器交互**: 某些容器(如 Tomcat)会自动处理部分状态码,可通过 `<error-page>` 配置覆盖 #### 常见状态码示例 | 状态码 | 含义 | 设置方法 | |--------|-----------------------|------------------------------------------| | 200 | 成功 | `setStatus(200)` | | 400 | 错误请求 | `sendError(400, "描述")` | | 401 | 未授权 | `setStatus(HttpServletResponse.SC_UNAUTHORIZED)` | | 403 | 禁止访问 | `sendError(403)` | | 499 | 自定义客户端错误 | `setStatus(499)` | | 503 | 服务不可用 | `setStatus(503)` | > **重要**:`setStatus()` 仅设置状态码,`sendError()` 会触发容器错误页(可通过 `<error-page>` 配置覆盖) ### 相关问题 1. 如何在 Spring Boot 中全局处理 Filter 抛出的异常? 2. 自定义 HTTP 状态码时如何确保前端正确解析? 3. 如何在 Filter 中区分不同类型的业务错误并返回不同状态码? 4. 使用自定义状态码时有哪些 HTTP 协议规范需要注意?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值