问题: 客户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>
修改前:
修改后