私はフィルタ(私の場合は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();
}
-1この回答は役に立ちましたか? @ YevgeniyM。 – Yevgeniy
あなたは正しいです、ちょうどそのようなラッパークラス+1があるというコメントだったはずです。 –
私はHttpServletResponseWrapperを使って解決策を実装しましたが、それでも動作させることはできません!上記の質問を新しいコードで更新します。 – Phil