現在レガシーシステムで作業しています。システムはJava 4とStruts 1.3を使用しています。セキュリティは厳しいものです。とにかくHttpServletResponseWrapper java.lang.ClassCastException Java 4およびストラット1.3を使用して
システムの要求と応答のためのロガーを作成するように求められました。この考えは、新しいユーザーインターフェイスと機能について何らかの監査を行うことです。顧客がログに記録された要求と応答によって何が起きたのかを追跡できるという不満がある場合です。
アイデアはすべてのモジュールにログを記録することではありません。彼らはストラット1.3を使用しているので、私の最初の提案はServlet Filter、ActionServletまたはRequestprocessorを使ってモジュールを実装することです。サーブレットフィルタを試しましたが、web.xmlがhttp__java.sun.com_dtd_web_app_2.2.dtdを使用しているため動作できません。 Servlet Filterが導入されたときに私は2.3を見つけました。
ActionServletまたはRequestprocessorを使用してモジュールを実装しようとしましたが、私は少なくともHttpServletRequestを取得することができます。しかし、このバージョンのstrutsとjavaではHttpServletResponseには実際にゲッターがありません。私はHttpServletResponseWrapperから派生したクラスを実装しました。
ウェブブラウザでは何も使用していませんでした。私がチェックしたとき。私は実行時例外 - java.lang.ClassCastExceptionを取得しています。私はHttpServletResponseWrapperがServlet Filterでしか使用できないか、私が持っているライブラリが古いかどうかはわかりません。
基本的にこれは私がアクションサーブレットでどのように使用したかです。
public void doGet (HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
{
responseCapture = new M2UResponseWrapper((HttpServletResponse) response);
try
{
super.doGet(request, responseCapture);
}
catch (Exception e)
{
Logger.error("Exception Type 1 : " + e);
}
}
以下は私のHttpServletResponseWrapper
実装です。これは私の最初のテストです。
public class MyResponseWrapper extends HttpServletResponseWrapper {
private final HttpServletResponse httpResponse;
private int responseStatus;
private String errMessage;
private String redirectURL;
private ArrayList responseCookieList;
private Map responseDateHeader;
private Map responseHeader;
private Map responseIntHeader;
protected M2UServletOutputStreamWrapper output;
protected CharArrayWriter charWriter;
protected PrintWriter writer;
protected boolean getOutputStreamCalled;
protected boolean getWriterCalled;
public M2UResponseWrapper (HttpServletResponse httpResponse) {
super(httpResponse);
this.httpResponse = httpResponse;
getOutputStreamCalled = false;
getWriterCalled = false;
charWriter = new CharArrayWriter();
output = new M2UServletOutputStreamWrapper();
responseCookieList = new ArrayList();
responseDateHeader = new HashMap();
responseHeader = new HashMap();
responseIntHeader = new HashMap();
}
public String toString() {
return charWriter.toString();
}
public boolean containsHeader(String name) {
return httpResponse.containsHeader(name);
}
public void addIntHeader(String name, int value) {
responseIntHeader.put(name, Integer.toString(value));
httpResponse.addIntHeader(name, value);
}
public void addDateHeader(String name, long date) {
responseDateHeader.put(name,String.valueOf(date));
httpResponse.addDateHeader(name,date);
}
public void addHeader(String name, String value) {
responseHeader.put(name,value);
httpResponse.addHeader(name, value);
}
public void setDateHeader(String name, long date) {
responseDateHeader.put(name,String.valueOf(date));
httpResponse.setDateHeader(name, date);
}
public void setHeader(String name, String value) {
responseHeader.put(name,value);
httpResponse.setHeader(name, value);
}
public void setIntHeader(String name, int value) {
responseIntHeader.put(name, Integer.toString(value));
httpResponse.setIntHeader(name, value);
}
public Iterator getHeader() {
return responseHeader.keySet().iterator();
}
public Iterator getDateHeader() {
return responseDateHeader.keySet().iterator();
}
public Iterator getIntHeader() {
return responseIntHeader.keySet().iterator();
}
public void sendError(int sc) throws IOException {
responseStatus = sc;
try {
httpResponse.sendError(sc);
} catch (IOException e) {
e.printStackTrace();
}
}
public void sendError(int sc, String msg) throws IOException {
responseStatus = sc;
errMessage = msg;
try {
httpResponse.sendError(sc, msg);
} catch (IOException e) {
e.printStackTrace();
}
}
public void setStatus(int sc) {
responseStatus = sc;
httpResponse.setStatus(sc);
}
public void setStatus(int sc, String sm) {
responseStatus = sc;
errMessage = sm;
httpResponse.setStatus(sc, sm);
}
public String getErrorMessage() {
return errMessage;
}
public int getStatus() {
return responseStatus;
}
public String getRedirectURL() {
return redirectURL;
}
public void sendRedirect(String location) throws IOException {
responseStatus = 302;
redirectURL = location;
try {
httpResponse.sendRedirect(location);
} catch (IOException e) {
e.printStackTrace();
}
}
public void addCookie(Cookie cookie) {
responseCookieList.add(cookie);
httpResponse.addCookie(cookie);
}
public ArrayList getCookie() {
return responseCookieList;
}
public PrintWriter getWriter() throws IOException{
if (getOutputStreamCalled) {
throw new IllegalStateException("getOutputStream() has already been called on this response.");
}
try {
if (writer != null) {
writer = new PrintWriter(charWriter);
}
} catch (Exception e) {
e.printStackTrace();
}
getWriterCalled = true;
return writer;
}
public boolean isOutputStreamCalled() {
return getOutputStreamCalled;
}
public boolean isWriterCalled() {
return getWriterCalled;
}
public ServletOutputStream getOutputStream() throws IOException {
if (getWriterCalled) {
throw new IllegalStateException("getWriterCalled() has already been called on this response.");
}
getOutputStreamCalled = true;
return (ServletOutputStream) output;
}
}
私はHttpServletResponseWrapperをはHttpServletResponseのを取得するために使用されていることを多くの例を見てきましたが、それらは、すべてのサーブレットフィルタで実装されています。 Servlet Filter要求と応答がServletRequestとServletResponseオブジェクトであるため、実際にはServletやRequest ProcessorでHttpServletResponseWrapperを使用できないかどうかはわかりません。
私はレガシーシステムに取り組んでいますので、struts 3またはspringにアップグレードするか、またはjava web app 2.3以降を使用してください。dtdは本当にオプションではありません。私は私のラッパー実装で間違いを犯したと思っています。あなたには他の提案があります。
私はコマンドシェルを使ってロギング用の管理者スニッフィングツールを実行します。それは直ちに拒絶された。
[最小限で完全で検証可能な例を追加してください](https://stackoverflow.com/help/mcve) –