zoukankan      html  css  js  c++  java
  • JavaWeb-用过滤器修改请求的返回状态码

    问题: 客户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>
    

    修改前:

     修改后

     

  • 相关阅读:
    ORACLE 使用笔记
    Python资源大全,让你相见恨晚的Python库
    基于python的k-s值计算
    sklearn聚类模型:基于密度的DBSCAN;基于混合高斯模型的GMM
    skearn学习路径
    透彻形象理解核函数
    LDA降维与PCA降维对比
    sklearn 岭回归
    GBDT、XGBOOST、LightGBM对比学习及调参
    sklearn,交叉验证中的分层抽样
  • 原文地址:https://www.cnblogs.com/yaohuimo/p/12063682.html
Copyright © 2011-2022 走看看