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

本文介绍了HTTP状态响应码的基本概念、自定义状态响应码的必要性、实现方式及应用场景,包括如何通过自定义状态码提升系统提示的一致性和ajax请求的灵活性。
[size=large]一、什么是HTTP 状态响应码/都有哪些状态响应码?[/size]
来自于Mozilla基金会网站的关于HTTP状态码的文章([url]https://developer.mozilla.org/zh-TW/docs/HTTP/Response_codes[/url])指出HTTP状态码分为5大类,分别代表:
1xx 信息化响应 (ps: http1.1之前是保留区段,HTTP1.1规定了2项)
2xx 成功响应
3xx 重定向消息
4xx 客户端错误
5xx 服务器端错误

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

[size=large]三、自定义状态码的实现[/size]

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

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

applyStatusCodeIfPossible(requset,response,code)
方法。
[size=large]四、自定义状态码的应用[/size]

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 协议规范需要注意?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值