問題: 客戶SDK對接服務,默認只識別200和非200的請求狀態碼。需要修改當前應用的狀態碼(如將201轉為200)
解決方案:通過擴展HttpServletResponseWrapper,獲取到每個請求的狀態碼,滿足條件的做修改即可
具體代碼:
package com.supermap.huawei; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; /** * 1、輸出http信息 2、修改返回的狀態碼 * */ public class ResponseCodeFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; StatusExposingServletResponse response = new StatusExposingServletResponse( (HttpServletResponse) res); String ip = request.getRemoteAddr(); String method = request.getMethod(); String url = request.getRequestURI(); String characterEncoding = request.getCharacterEncoding(); String referer = request.getHeader("Referer"); chain.doFilter(request, response); int status = response.getStatus(); System.out.println(ip + method + characterEncoding + referer + url + status); // String s1 = "" + status; if (status == 201) { // if(s1.contains("20")){ response.setStatus(200); } else { response.setStatus(status); } } @Override public void destroy() { } public static class StatusExposingServletResponse extends HttpServletResponseWrapper implements HttpServletResponse { private int status = 200; public StatusExposingServletResponse(HttpServletResponse response) { super(response); } @Override public void setStatus(int sc) { this.status = sc; super.setStatus(sc); } public int getStatus() { return status; } } }
web.xml中的配置
<filter> <filter-name>ResponseCodeFilter</filter-name> <filter-class>com.supermap.test.ResponseCodeFilter</filter-class> </filter> <filter-mapping> <filter-name>ResponseCodeFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
修改前:
修改后