是的,那是可能的。您需要借助以下方法来修饰响应:在
HttpServletResponseWrapper其中,您可以用
ServletOutputStream自定义实现替换,该实现将字节写入MD5摘要和“原始”输出流。最后提供一个访问器以获得最终的MD5和。
更新 我只是为了好玩而已,下面是一个启动示例:
响应包装器:
public class MD5ServletResponse extends HttpServletResponseWrapper { private final MD5ServletOutputStream output; private final PrintWriter writer; public MD5ServletResponse(HttpServletResponse response) throws IOException { super(response); output = new MD5ServletOutputStream(response.getOutputStream()); writer = new PrintWriter(output, true); } public PrintWriter getWriter() throws IOException { return writer; } public ServletOutputStream getOutputStream() throws IOException { return output; } public byte[] getHash() { return output.getHash(); }}MD5输出流:
public class MD5ServletOutputStream extends ServletOutputStream { private final ServletOutputStream output; private final MessageDigest md5; { try { md5 = MessageDigest.getInstance("MD5"); } catch (NoSuchAlgorithmException e) { throw new ExceptionInInitializerError(e); } } public MD5ServletOutputStream(ServletOutputStream output) { this.output = output; } public void write(int i) throws IOException { byte[] b = { (byte) i }; md5.update(b); output.write(b, 0, 1); } public byte[] getHash() { return md5.digest(); }}如何使用它:
// Wrap original response with it:MD5ServletResponse md5response = new MD5ServletResponse(response);// Now just use md5response instead or response, e.g.:dispatcher.handle(request, md5response);// Then get the hash, e.g.:byte[] hash = md5response.getHash();StringBuilder hashAsHexString = new StringBuilder(hash.length * 2);for (byte b : hash) { hashAsHexString.append(String.format("%02x", b));}System.out.println(hashAsHexString); // Example af28cb895a479397f12083d1419d34e7.


