| 36514 |
amit |
1 |
package com.spice.profitmandi.web.filter;
|
|
|
2 |
|
|
|
3 |
import javax.servlet.*;
|
|
|
4 |
import javax.servlet.http.HttpServletRequest;
|
|
|
5 |
import javax.servlet.http.HttpServletRequestWrapper;
|
|
|
6 |
import java.io.*;
|
|
|
7 |
|
|
|
8 |
public class RequestCachingFilter implements Filter {
|
|
|
9 |
|
|
|
10 |
@Override
|
|
|
11 |
public void init(FilterConfig filterConfig) throws ServletException {}
|
|
|
12 |
|
|
|
13 |
@Override
|
|
|
14 |
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
|
|
|
15 |
throws IOException, ServletException {
|
|
|
16 |
HttpServletRequest httpRequest = (HttpServletRequest) request;
|
|
|
17 |
if ("POST".equalsIgnoreCase(httpRequest.getMethod())
|
|
|
18 |
&& !isMultipart(httpRequest)
|
|
|
19 |
&& !isFormEncoded(httpRequest)) {
|
|
|
20 |
chain.doFilter(new CachedBodyRequest(httpRequest), response);
|
|
|
21 |
} else {
|
|
|
22 |
chain.doFilter(request, response);
|
|
|
23 |
}
|
|
|
24 |
}
|
|
|
25 |
|
|
|
26 |
@Override
|
|
|
27 |
public void destroy() {}
|
|
|
28 |
|
|
|
29 |
private boolean isMultipart(HttpServletRequest request) {
|
|
|
30 |
String contentType = request.getContentType();
|
|
|
31 |
return contentType != null && contentType.toLowerCase().startsWith("multipart/");
|
|
|
32 |
}
|
|
|
33 |
|
|
|
34 |
private boolean isFormEncoded(HttpServletRequest request) {
|
|
|
35 |
String contentType = request.getContentType();
|
|
|
36 |
return contentType != null && contentType.toLowerCase().startsWith("application/x-www-form-urlencoded");
|
|
|
37 |
}
|
|
|
38 |
|
|
|
39 |
public static class CachedBodyRequest extends HttpServletRequestWrapper {
|
|
|
40 |
private final byte[] body;
|
|
|
41 |
|
|
|
42 |
public CachedBodyRequest(HttpServletRequest request) throws IOException {
|
|
|
43 |
super(request);
|
|
|
44 |
InputStream is = request.getInputStream();
|
|
|
45 |
ByteArrayOutputStream baos = new ByteArrayOutputStream(1024);
|
|
|
46 |
byte[] buf = new byte[1024];
|
|
|
47 |
int len;
|
|
|
48 |
while ((len = is.read(buf)) != -1) {
|
|
|
49 |
baos.write(buf, 0, len);
|
|
|
50 |
}
|
|
|
51 |
this.body = baos.toByteArray();
|
|
|
52 |
}
|
|
|
53 |
|
|
|
54 |
@Override
|
|
|
55 |
public ServletInputStream getInputStream() {
|
|
|
56 |
ByteArrayInputStream bais = new ByteArrayInputStream(body);
|
|
|
57 |
return new ServletInputStream() {
|
|
|
58 |
@Override public int read() { return bais.read(); }
|
|
|
59 |
@Override public boolean isFinished() { return bais.available() == 0; }
|
|
|
60 |
@Override public boolean isReady() { return true; }
|
|
|
61 |
@Override public void setReadListener(ReadListener listener) {}
|
|
|
62 |
};
|
|
|
63 |
}
|
|
|
64 |
|
|
|
65 |
@Override
|
|
|
66 |
public BufferedReader getReader() {
|
|
|
67 |
return new BufferedReader(new InputStreamReader(getInputStream()));
|
|
|
68 |
}
|
|
|
69 |
|
|
|
70 |
public byte[] getCachedBody() {
|
|
|
71 |
return body;
|
|
|
72 |
}
|
|
|
73 |
}
|
|
|
74 |
}
|