《servlet》过滤器修改HttpServletRequest里面的Parameter, 过滤器获取HttpServletResponse结果.

1.编写 ParameterRequestWrapper 包装类

拦截器传它就可以了

/**
 * 
 * @author guokaige
 * @date: 2019年1月15日 下午2:47:24
 */

public class ParameterRequestWrapper extends HttpServletRequestWrapper {

	private Map<String, String[]> params = new HashMap<String, String[]>();

	public ParameterRequestWrapper(HttpServletRequest request) {
		// 将request交给父类,以便于调用对应方法的时候,将其输出,其实父亲类的实现方式和第一种new的方式类似
		super(request);
		// 将参数表,赋予给当前的Map以便于持有request中的参数
		this.params.putAll(request.getParameterMap());
	}

	public ParameterRequestWrapper(HttpServletRequest request, Map<String, Object> extendParams) {
		this(request);
		addAllParameters(extendParams);
	}

	@Override
	public String getParameter(String name) {
		String[] values = params.get(name);
		if (values == null || values.length == 0) {
			return null;
		}
		return values[0];
	}

	@Override
	public String[] getParameterValues(String name) {
		return params.get(name);
	}

	public void addAllParameters(Map<String, Object> otherParams) {
		for (Map.Entry<String, Object> entry : otherParams.entrySet()) {
			addParameter(entry.getKey(), entry.getValue());
		}
	}

	public void addParameter(String name, Object value) {
		if (value != null) {
			if (value instanceof String[]) {
				params.put(name, (String[]) value);
			} else if (value instanceof String) {
				params.put(name, new String[] { (String) value });
			} else {
				params.put(name, new String[] { String.valueOf(value) });
			}
		}
	}
}

2. 拦截器修改参数 

/**
 * 
 * @author guokaige
 * @date: 2018年10月31日 下午5:22:29
 */
@Component("parametersFilter")
public class ParametersFilter extends OncePerRequestFilter {

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		try {
			System.out.println("--------------------------BizExceptionFilter-----"+request.getParameter("password"));
			
			String password = request.getParameter("password");
			
			if(Strings.hasText(password)) {
				
				ParameterRequestWrapper requestWrapper = new ParameterRequestWrapper((HttpServletRequest)request);  

	            requestWrapper.addParameter("password" , "123456");
	            
	            System.out.println("--------------------------BizExceptionFilter-----"+requestWrapper.getParameter("password"));
				
				filterChain.doFilter(requestWrapper, response);
			}else {
				filterChain.doFilter(request, response);
			}

			
			
		} catch (Exception ex) {
			throw ex;
		}
	}

}

3. ResponseWrapper

/**
 * 
 * @author guokaige
 * @date: 2019年1月21日 上午9:28:36
 */
public class ResponseWrapper extends HttpServletResponseWrapper {

    private ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    
    @SuppressWarnings("unused")
	private HttpServletResponse response;
    
    private PrintWriter pwrite;

    public ResponseWrapper(HttpServletResponse response) {
        super(response);
        this.response = response;
    }

    @Override
    public ServletOutputStream getOutputStream() throws IOException {
        return new MyServletOutputStream(bytes); // 将数据写到 byte 中
    }

    /**
     * 重写父类的 getWriter() 方法,将响应数据缓存在 PrintWriter 中
     */
    @Override
    public PrintWriter getWriter() throws IOException {
        try{
            pwrite = new PrintWriter(new OutputStreamWriter(bytes, "utf-8"));
        } catch(UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return pwrite;
    }

    /**
     * 获取缓存在 PrintWriter 中的响应数据
     * @return
     */
    public byte[] getBytes() {
        if(null != pwrite) {
            pwrite.close();
            return bytes.toByteArray();
        }

        if(null != bytes) {
            try {
                bytes.flush();
            } catch(IOException e) {
                e.printStackTrace();
            }
        }
        return bytes.toByteArray();
    }

    class MyServletOutputStream extends ServletOutputStream {
        private ByteArrayOutputStream ostream ;

        public MyServletOutputStream(ByteArrayOutputStream ostream) {
            this.ostream = ostream;
        }

        @Override
        public void write(int b) throws IOException {
            ostream.write(b); // 将数据写到 stream 中
        }

		@Override
		public boolean isReady() {
			// TODO Auto-generated method stub
			return false;
		}

		@Override
		public void setWriteListener(WriteListener listener) {
			// TODO Auto-generated method stub
			
		}


    }

}

 4. 获取之后写回

/**
 * 
 * @author guokaige
 * @date: 2018年10月31日 下午5:22:29
 */
@Component("oAuth2AccessTokenFilter")
public class OAuth2AccessTokenFilter extends OncePerRequestFilter {

	private static final String OAUTH_TOKEN_URL = "/oauth/token";
	
	
	@Autowired
	DefaultTokenServices tokenServices;

	@Override
	protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {

		try {

			String uri = request.getRequestURI();

			if (uri.contains(OAUTH_TOKEN_URL)) {

				ResponseWrapper responseWrapper = new ResponseWrapper(response);

				filterChain.doFilter(request, responseWrapper);

				byte[] responseBody = responseWrapper.getBytes();

				String body = new String(responseBody, Charset.forName("utf-8"));
				
				
				//tokenServices.readAccessToken("");

				System.out.println("---------------------------" + body);

				responseWrapper.getResponse().getOutputStream().write(responseBody);
				

			} else {
				filterChain.doFilter(request, response);
			}

		} catch (Exception ex) {
			request.setAttribute("errorMsg", "操作失败,请重试");
			RequestDispatcher dispatcher = request.getRequestDispatcher("/login");
			dispatcher.forward(request, response);
		}
	}

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值