フィルタ(私の場合はCorsFilter)を使用してタイミングを測定し、メッセージ自体にかかる時間を設定できるかどうか疑問に思っています。私は次のことがうまくいくことを知っています:
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
chain.doFilter(request, response);
long endTime = System.nanoTime();
System.out.println("Time: " + (endTime - startTime) );
}
もちろん、合計時間を秒単位で出力します。受信者がヘッダーを見て処理にかかった時間を確認できるように、返された応答のヘッダーに時間を入れたかったのです。次のコードは機能しません。
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("Start-time", Long.toString(startTime));
}
chain.doFilter(request, response);
long endTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("End-time", Long.toString(endTime));
}
}
ヘッダーには開始時刻のみが含まれ、終了時刻は含まれません。これは、メッセージがすでに送信されているため、オブジェクトを変更しても効果がないためだと思います。
誰かがフィルターを使用してヘッダーにタイミングを入れるためのエレガントで賢い解決策を持っていますか?
ありがとう、フィル
アップデート
このソリューションに対処するためのHttpServletResponseWrapperの使用を調査しました。それでも、応答ヘッダーにXXX-EndTimeまたはYYY-EndTimeを出力できません。
@Override
public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {
long startTime = System.nanoTime();
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("Access-Control-Allow-Origin", "*");
httpResp.addHeader("Access-Control-Allow-Methods", "GET, HEAD, OPTIONS");
httpResp.addHeader("Allow", "GET, HEAD, OPTIONS");
httpResp.addHeader("Access-Control-Allow-Headers", "*");
httpResp.addHeader("A-Runtime", Long.toString(startTime));
}
OutputStream out = response.getOutputStream();
GenericResponseWrapper wrapper = new GenericResponseWrapper((HttpServletResponse) response);
chain.doFilter(request,wrapper);
out.write(wrapper.getData());
if(response instanceof HttpServletResponse) {
HttpServletResponse httpResp = (HttpServletResponse)response;
httpResp.addHeader("XXX-EndTime", Long.toString(System.nanoTime() - startTime));
wrapper.addHeader("YYY-EndTime", Long.toString(System.nanoTime() - startTime));
}
out.close();
}