有用なログが見つかりませんでしたので、リクエストを記録するためにサーブレットフィルタをまとめました。クエリ文字列は実際にはPOSTリクエストのペイロードにあることを覚えておいてください。リクエストラッパーを作成する必要があるので、ペイロードを下流側で必要とするサービスに干渉することなくフィルタで読み取ることができます。私がそれをしている間は、コンテンツタイプとパラメータもログに記録しました。本当にラッパーは必要ありません。要求情報に非破壊的にアクセスできるからです。この方法を使用するには、フィルタ用とラッパー用の2つのクラスを作成します。そして、このようにweb.xmlにフィルタを追加し、/ Tomcatの/ webappsに/屋外/ WEB-INF /クラスでそれらの両方を入れて...
<filter>
<filter-name>post-body-filter</filter-name>
<filter-class>filter.PostBodyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>post-body-filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
結果は、弁を含んでログファイルに入れることができますこのようなserver.xmlのエントリ。ログには、REQBODYのクエリが表示されます。探すべき接頭辞はlocalhost_access_logです。
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
prefix="localhost_access_log." suffix=".txt"
pattern=" %t %r contentType:%{REQCONTENTTYPE}r parameters:%{REQPARAMETERS}r body:%{REQBODY}r %s" />
クラス自体はこのように見えます。フィルタの他の例から自由に借用することを認めます。私がどこだけ覚えていれば帰属(または責め)を与えるだろう。私はそれが改善できると確信しています。
package filter;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Enumeration;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import filter.FilterRequestWrapper
public class PostBodyFilter implements Filter {
private FilterConfig filterConfig = null;
public void destroy() {
this.filterConfig = null;
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
if (filterConfig == null)
return;
FilterRequestWrapper requestWrapper = new FilterRequestWrapper((HttpServletRequest) request);
String contentType = request.getContentType();
StringBuffer parameters = getParameters(request);
StringBuffer body = getBody(requestWrapper);
request.setAttribute("REQPARAMETERS", parameters);
request.setAttribute("REQBODY", body);
request.setAttribute("REQCONTENTTYPE", contentType);
chain.doFilter(requestWrapper, response);
}
private static StringBuffer getParameters(ServletRequest request) {
Enumeration<String> names = request.getParameterNames();
StringBuffer parameters = new StringBuffer();
while (names.hasMoreElements()) {
String name = (String) names.nextElement();
parameters.append(name + "=");
String values[] = request.getParameterValues(name);
for (int i = 0; i < values.length; i++) {
if (i > 0)
parameters.append("' ");
parameters.append(values[i]);
}
if (names.hasMoreElements())
parameters.append(" ");
}
return parameters;
}
private static StringBuffer getBody(ServletRequest request)
throws IOException {
StringBuffer body = new StringBuffer();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(
inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
body.append(charBuffer, 0, bytesRead);
}
} else {
body.append("");
}
} catch (IOException ex) {
throw ex;
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
throw ex;
}
}
}
return body;
}
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
}
}
package filter;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class FilterRequestWrapper extends HttpServletRequestWrapper {
private final String body;
public FilterRequestWrapper(HttpServletRequest request) {
super(request);
StringBuilder stringBuilder = new StringBuilder();
BufferedReader bufferedReader = null;
try {
InputStream inputStream = request.getInputStream();
if (inputStream != null) {
bufferedReader = new BufferedReader(new InputStreamReader(
inputStream));
char[] charBuffer = new char[128];
int bytesRead = -1;
while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
stringBuilder.append(charBuffer, 0, bytesRead);
}
} else {
stringBuilder.append("");
}
} catch (IOException ex) {
} finally {
if (bufferedReader != null) {
try {
bufferedReader.close();
} catch (IOException ex) {
}
}
}
body = stringBuilder.toString();
}
@Override
public ServletInputStream getInputStream() throws IOException {
final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
body.getBytes());
ServletInputStream inputStream = new ServletInputStream() {
public int read() throws IOException {
return byteArrayInputStream.read();
}
};
return inputStream;
}
}
ありがとうございました。私はおそらくこれの前にクライアントのログを調べるでしょう。なぜなら、それは私にとってはあまりにも「侵略的」なのですから、私はこれに落ちなければならないかもしれません! –