Parsing permintaan HTTP dengan filter log Java
javax.servlet.FilterCara mudah untuk mengimplementasikan dan mengurai konten permintaan HTTP dan log keluaran.SaringMemperkenalkan kelas.
Filter log ini menggunakan "java.util.logging.Logger" untuk keluaran log, dan Anda dapat mengubah keluaran informasi dengan mengubah tingkat log.
Apa itu javax.servlet.Filter?
Saat membangun aplikasi web, selain pemrosesan bisnis utama, perlu dilakukan pemrosesan sekunder umum sebelum dan sesudah pemrosesan bisnis utama.
Misalnya, otentikasi klien, pemeriksaan otoritas, pencatatan, dll.
Pengkodean pemrosesan sampingan seperti itu di setiap sumber daya menjadi penyebab utama terhambatnya pemeliharaan perangkat lunak, sehingga mengakibatkan aplikasi sulit untuk dipelihara.
Dengan mengimplementasikan javax.servlet.Filter, Anda biasanya dapat melakukan pemrosesan sampingan ini sebelum permintaan diteruskan ke kelas servlet.
Selain itu, karena pengaturan filter dapat dilakukan di web.xml, Anda dapat secara fleksibel menambah atau menghapus filter tanpa mengubah kode sumber.
Coba gunakan filter log
Mari kita gunakan filter log untuk memfilter permintaan HTTP dan menganalisisnya.
Kali iniKucing jantanKami akan menggunakan contoh aplikasi yang tersedia dari awal.
Anda dapat langsung menjalankan filter ini dengan melakukan pengaturan berikut.
2. Tempatkan file kelas yang telah dikompilasi di bawah "/examples/WEB-INF/classes".
3.Tetapkan definisi berikut di web.xml.
Filter Log Filter Log logging.Level BAGUS Filter Log /*
*Pola url saat menggunakan framework Struts adalah sebagai berikut.
*.Mengerjakan
Silakan periksa hasil keluaran log dari eksekusi layar Contoh Sesi.
Informasi log keluaran dan level log
●Log konten keluaran
Mencatat informasi | tingkat log |
---|---|
Informasi kue | BAGUS |
Informasi tajuk HTTP | BAGUS |
HTTPInformasi lainnya | BAGUS |
Parameter permintaan HTTP | KONFIGURASI |
objek cakupan permintaan | KONFIGURASI |
objek cakupan sesi | KONFIGURASI |
Penggunaan memori sebelum dan sesudah permintaan | KONFIGURASI |
Informasi transisi layar | INFORMASI |
Yang terbaik adalah menggunakan level log sebagai berikut.
- FINE: Menampilkan log paling detail. Atur ini jika Anda ingin menganalisis permintaan HTTP secara detail.
- CONFIG... Menghasilkan log yang agak detail. Merupakan ide bagus untuk mempertahankannya pada level ini selama periode pengembangan.
- INFO: Hanya mengeluarkan informasi transisi layar.
●Cara mengubah level log
Anda dapat mengubah tingkat keluaran log dengan mengatur parameter inisialisasi logging.Level.
contoh:
logging.Level INFORMASI
Kode sumber
impor javax.servlet.Filter;
impor javax.servlet.FilterChain;
impor javax.servlet.FilterConfig;
impor javax.servlet.ServletException;
impor javax.servlet.ServletRequest;
impor javax.servlet.ServletResponse;
impor javax.servlet.http.Cookie;
impor javax.servlet.http.HttpServletRequest;
impor javax.servlet.http.HttpServletResponse;
impor javax.servlet.http.HttpSession;
/**
* Terapkan javax.servlet.Filter untuk menganalisis konten permintaan HTTP dan log keluaran
* Kelas penyaring.
*/
LogFilter kelas publik mengimplementasikan Filter {
logger logger statis pribadi =
Logger.getLogger(LogFilter.kelas.getName());
String akhir statis pribadi LINE_SEPA =
System.getProperty(“line.separator”);
String akhir statis pribadi NEXT_PAGE = “LogFilter.NEXT_PAGE”;
/**
* Inisialisasi filter log ini.
* @param pemetaan
*/
public void init(Pemetaan FilterConfig) {
String str = pemetaan.getInitParameter(“logging.Level”);
System.out.println(“Setel level log ke “+str+”.”);
Tingkat tingkat = nol;
mencoba {
level = Level.parse(str);
} tangkapan (Pengecualian e) {
e.printStackTrace();
level = Level.INFO;
}
LogManager.getLogManager().reset();
Pengendali penangan = CustomConsoleHandler();
handler.setFormatter(CustomFormatter());
handler.setLevel(tingkat);
logger.setLevel(tingkat);
logger.getParent().addHandler(penangan);
}
/**
* Ini adalah filter yang mengeluarkan log.
* @param meminta permintaan HTTP sedang diproses
* Respon @param Respon HTTP sedang dihasilkan
* @rantai param
*/
public void doFilter(ServletRequest _request, ServletResponse _response,
Rantai FilterChain) menampilkan IOException, ServletException {
// --------------------" Pemrosesan awal "
Permintaan HttpServletRequest = (HttpServletRequest) _permintaan;
Respon HttpServletResponse = (HttpServletResponse) _response;
if (logger.isLoggable(Level.CONFIG)) {
logger.config(
“============ Permintaan Mulai!!”
+”ID Rangkaian:”
+ Utas.Benang Saat Ini().Kode Hash()
+ ” ========================================================”);
}
// penggunaan memori
String actionMemory = null;
if (logger.isLoggable(Level.CONFIG)) {
tindakanMemori = getMemoryInfo(” ”
+ Waktu baru(System.currentTimeMillis()) + ”Permintaan[sebelumnya]”);
}
if (logger.isLoggable(Level.FINE)) {
logger.fine("Informasi Cookie" + getCookieInfo(permintaan));
}
if (logger.isLoggable(Level.FINE)) {
logger.fine("Informasi header HTTP" + getHeadersInfo(permintaan));
}
if (logger.isLoggable(Level.FINE)) {
penebang
.fine("Informasi lain HTTP" + getRequestOtherInfo(permintaan));
}
if (logger.isLoggable(Level.CONFIG)) {
String reqlog = getRequestParametersInfo(permintaan);
logger.config("Parameter permintaan HTTP" + reqlog);
}
if (logger.isLoggable(Level.CONFIG)) {
logger.config("objek cakupan permintaan"
+ getRequestAttributeInfo(permintaan));
}
if (logger.isLoggable(Level.CONFIG)) {
String sessionlog = getSessionInfo(permintaan,benar);
logger.config("objek cakupan sesi (sebelum pemrosesan permintaan)"
+ log sesi);
}
// panggil filter berikutnya
chain.doFilter(permintaan, tanggapan);
// -------------------- "Pengolahan pasca"
if (logger.isLoggable(Level.CONFIG)) {
String sessionlog = getSessionInfo(permintaan,salah);
logger.config("objek cakupan sesi (setelah pemrosesan permintaan)"
+ log sesi);
}
// penggunaan memori
if (logger.isLoggable(Level.CONFIG)) {
actionMemory = ”Penggunaan memori sebelum dan sesudah permintaan”+LINE_SEPA
+ AksiMemori + LINE_SEPA
+ getMemoryInfo(” ” + Waktu baru(Sistem.currentTimeMillis())
+ ”permintaan[setelah]”);
logger.config(actionMemory+LINE_SEPA);
}
// Informasi transisi layar
if (logger.isLoggable(Level.INFO)) {
String nextPage = (String) permintaan.getAttribute(NEXT_PAGE);
if (Halaman berikutnya == null || Halaman berikutnya.panjang() == 0) {
halaman berikutnya = permintaan.getRequestURI();
}
logger.info(“NEXT_PAGE=[” + Halaman berikutnya + “], ”
+ “IP_ADDRESS=[” + permintaan.getRemoteAddr() + “], ”
+ “SESSION_ID=[” + permintaan.getSession().getId() + “], ”
+ “USER-AGENT=[” + request.getHeader(“agen-pengguna”) + “]”);
}
if (logger.isLoggable(Level.CONFIG)) {
logger.config(
“============ Permintaan Berakhir!!”
+”ID Thread:”+ Thread.currentThread().hashCode()
+ ” =========================================================”
+LINE_SEPA+LINE_SEPA);
}
}
/**
*
*/
kekosongan publik menghancurkan() {
}
// ---------- Cara pribadi di bawah -----------
private static String getMemoryInfo(String pesan) {
DecimalFormat dFromat = DecimalFormat baru(“#,###KB”);
bebas panjang = Runtime.getRuntime().freeMemory() / 1024;
total panjang = Runtime.getRuntime().totalMemory() / 1024;
long max = Runtime.getRuntime().maxMemory() / 1024;
sudah lama digunakan = total – gratis;
Pesan string = pesan + ” : ” + “total=” + dFromat.format(total) + “, ”
+ “Jumlah yang terpakai=” + dFromat.format(bekas) + ” (“” + (bekas * 100 / total)
+ “%), maksimum yang tersedia=” + dFromat.format(maks);
membalas pesan;
}
/**
* Keluarkan semua header permintaan ke log.
*/
String statis pribadi getHeadersInfo(permintaan HttpServletRequest) {
Penggemar StringBuffer = StringBuffer baru(LINE_SEPA);
Pencacahan headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = (String) headerNames.nextElement();
buff.append(” “);
buff.append(namaheader);
buff.append(“=”);
buff.append(request.getHeader(headerName));
buff.append(LINE_SEPA);
}
kembalikan buff.toString();
}
String statis pribadi getCookieInfo(permintaan HttpServletRequest) {
StringBuffer buff = StringBuffer baru();
Kue[] kue = permintaan.getCookies();
if (cookie == null) {
kembali "";
}
for (int i = 0; i < cookie.panjang; i++) {
buff.append(“\n — Kue[” + i + “] —\n”);
buff.append(” “);
buff.append(cookie[i].getName());
buff.append(“=”);
buff.append(cookie[i].getValue());
buff.append(LINE_SEPA);
buff.append(” “);
buff.append(“getVersion()”);
buff.append(“=”);
buff.append(cookie[i].getVersion());
buff.append(LINE_SEPA);
buff.append(” “);
buff.append(“getComment()”);
buff.append(“=”);
buff.append(cookie[i].getComment());
buff.append(LINE_SEPA);
buff.append(” “);
buff.append(“getDomain()”);
buff.append(“=”);
buff.append(cookie[i].getDomain());
buff.append(LINE_SEPA);
buff.append(” “);
buff.append(“getMaxAge()”);
buff.append(“=”);
buff.append(cookie[i].getMaxAge());
buff.append(LINE_SEPA);
buff.append(” “);
buff.append(“getPath()”);
buff.append(“=”);
buff.append(cookie[i].getPath());
buff.append(LINE_SEPA);
buff.append(” “);
buff.append(“getSecure()”);
buff.append(“=”);
buff.append(cookie[i].getSecure());
buff.append(LINE_SEPA);
}
kembalikan buff.toString();
}
String statis pribadi getRequestParametersInfo(permintaan HttpServletRequest) {
Penggemar StringBuffer = StringBuffer baru(LINE_SEPA);
Peta peta = convertRequest(permintaan);
TreeMap trr = Peta Pohon baru(peta);
Iterator itr = trr.keySet().iterator();
while (itr.hasNext()) {
Kunci string = (String) itr.next();
buff.append(” “);
buff.append(kunci);
buff.append(“=”);
Nilai objek = map.get(key);
Nilai string[] = nilai (String[]);
if (nilai.panjang == 1) {
buff.append(nilai[0]);
} kalau tidak {
// Array string dikonversi
String strValue = lapisan(nilai);
buff.append(strValue);
}
buff.append(LINE_SEPA);
}
kembalikan buff.toString();
}
String statis pribadi getRequestAttributeInfo(permintaan HttpServletRequest) {
Penggemar StringBuffer = StringBuffer baru(LINE_SEPA);
Pencacahan e = request.getAttributeNames();
while (e.hasMoreElements()) {
Nama string = (String) e.nextElement();
buff.append(” nama=” + nama + “, kelas atribut= ”
+ permintaan.getAttribute(nama).getClass().getName()
+ “, toString() = ” + permintaan.getAttribute(nama)
+ LINE_SEPA);
}
kembalikan buff.toString();
}
String statis pribadi getRequestOtherInfo(permintaan HttpServletRequest) {
StringBuffer buff = StringBuffer baru();
buff.append(LINE_SEPA);
buff.append(”getCharacterEncoding()=”);
buff.append(request.getCharacterEncoding());
buff.append(LINE_SEPA);
buff.append(”getContentLength()=”);
buff.append(request.getContentLength());
buff.append(LINE_SEPA);
buff.append(”getContentType()=”);
buff.append(request.getContentType());
buff.append(LINE_SEPA);
buff.append(”getLocale()=”);
buff.append(request.getLocale());
buff.append(LINE_SEPA);
buff.append(”getProtocol()=”);
buff.append(request.getProtocol());
buff.append(LINE_SEPA);
buff.append(”getRemoteAddr()=”);
buff.append(request.getRemoteAddr());
buff.append(LINE_SEPA);
buff.append(”getRemoteHost()=”);
buff.append(request.getRemoteHost());
buff.append(LINE_SEPA);
buff.append(”getScheme()=”);
buff.append(request.getScheme());
buff.append(LINE_SEPA);
buff.append(”getServerName()=”);
buff.append(permintaan.getServerName());
buff.append(LINE_SEPA);
buff.append(”getServerPort()=”);
buff.append(request.getServerPort());
buff.append(LINE_SEPA);
buff.append(”isSecure()=”);
buff.append(permintaan.isSecure());
buff.append(LINE_SEPA);
buff.append(”getAuthType()=”);
buff.append(request.getAuthType());
buff.append(LINE_SEPA);
buff.append(”getContextPath()=”);
buff.append(request.getContextPath());
buff.append(LINE_SEPA);
buff.append(”getMethod()=”);
buff.append(request.getMethod());
buff.append(LINE_SEPA);
buff.append(”getPathInfo()=”);
buff.append(request.getPathInfo());
buff.append(LINE_SEPA);
buff.append(”getPathTranslated()=”);
buff.append(request.getPathTranslated());
buff.append(LINE_SEPA);
buff.append(”getQueryString()=”);
buff.append(request.getQueryString());
buff.append(LINE_SEPA);
buff.append(”getRemoteUser()=”);
buff.append(request.getRemoteUser());
buff.append(LINE_SEPA);
buff.append(”getRequestedSessionId()=”);
buff.append(request.getRequestedSessionId());
buff.append(LINE_SEPA);
buff.append(”getRequestURI()=”);
buff.append(request.getRequestURI());
buff.append(LINE_SEPA);
buff.append(”getServletPath()=”);
buff.append(request.getServletPath());
buff.append(LINE_SEPA);
buff.append(”getUserPrincipal()=”);
buff.append(request.getUserPrincipal());
buff.append(LINE_SEPA);
buff.append(”isRequestedSessionIdFromCookie()=”);
buff.append(request.isRequestedSessionIdFromCookie());
buff.append(LINE_SEPA);
buff.append(”isRequestedSessionIdFromURL()=”);
buff.append(request.isRequestedSessionIdFromURL());
buff.append(LINE_SEPA);
buff.append(”isRequestedSessionIdValid()=”);
buff.append(request.isRequestedSessionIdValid());
buff.append(LINE_SEPA);
kembalikan buff.toString();
}
private static String getSessionInfo(permintaan HttpServletRequest,boolean sebelumnya) {
Sesi HttpSession = request.getSession();
StringBuffer buff = StringBuffer baru();
buff.append(LINE_SEPA);
jika (sebelum) {
buff.append(” session.isNew() = ” + session.isNew());
buff.append(LINE_SEPA);
buff.append(” session.getId() = ” + session.getId());
buff.append(LINE_SEPA);
}
Pencacahan e = session.getAttributeNames();
while (e.hasMoreElements()) {
String sessionName = (String) e.nextElement();
String sessionClassName = sesi.getAttribute(sessionName)
.getClass().getName();
buff.append(” nama =” + nama sesi + “, nilai =”
+ session.getAttribute(sessionName) + “, atributKelas = ”
+ sessionClassName+LINE_SEPA);
}
kembalikan buff.toString();
}
private static Hashtable convertRequest(permintaan HttpServletRequest) {
tempHash tabel hash = Hashtable baru();
Pencacahan e = request.getParameterNames();
while (e.hasMoreElements()) {
Kunci string = (String) e.nextElement();
String[] nilai = permintaan.getParameterValues(kunci);
String[] parameterValues = String[nilai.panjang] baru;
for (int i = 0; i < nilai.panjang; i++) {
parameterValues[i] = convUnicode(nilai[i]);
}
tempHash.put(kunci, parameterValues);
}
kembalikan tempHash;
}
lapisan String statis pribadi (Nilai objek) {
jika (nilai == nol) {
kembalikan “nol”;
} else if (nilai instance dari String[]) {
mengembalikan nilai convString((String[]));
} kalau tidak {
mengembalikan nilai.toString();
}
}
/**
* Mengembalikan isi array string [strArray] sebagai String seperti di bawah ini.
* “[temp1,temp2,temp3]”
* @param strArray Array string yang akan dievaluasi
* @return String setelah konversi
*/
pribadi statis String convString(String[] strArray) {
jika (strArray == nol)
kembalikan nol;
Penggemar StringBuffer = StringBuffer baru(“[“);
for (int i = 0; i < strArray.panjang; i++) {
buff.append(strArray[i] + “, “);
}
buff.delete(buff.panjang() – 2, buff.panjang());
buff.append(“]”);
kembalikan buff.toString();
}
/**
* Konversikan [str] ke Unicode.
* @param str
* @kembali
*/
konvUnicode String statis pribadi(String str) {
jika (str == nol)
kembalikan nol;
mencoba {
kembalikan String baru(str.getBytes(“8859_1”), “JISAutoDetect”);
} tangkapan (Tidak DidukungEncodingException e) {
melempar RuntimeException(e);
}
}
// ———————————————————————–
kelas statis CustomFormatter memperluas Formatter {
pola String akhir statis = “yyyy/MM/dd HH:mm:ss”;
format String tersinkronisasi publik (catatan LogRecord) {
StringBuffer buf = StringBuffer baru();
// atur tanggal dan waktu
Tanggal tanggal = Tanggal baru();
tanggal.setTime(record.getMillis());
Pemformat SimpleDateFormat = SimpleDateFormat baru(pola);
buf.append(formatter.format(tanggal));
buf.tambahkan(“:”);
// atur tingkat
buf.append(“[” + catatan.getLevel().getName() + “]”);
buf.tambahkan(“:”);
buf.append(record.getMessage());
buf.append(LINE_SEPA);
kembalikan buf.toString();
}
}
kelas statis CustomConsoleHandler memperluas StreamHandler {
publik CustomConsoleHandler() {
super();
setOutputStream(Sistem.keluar);
}
/**
* Mengeluarkan Catatan Log.
* Awalnya, permintaan logging dikirim ke objek Logger.
* dan objek ini menginisialisasi LogRecord dan
*Dialihkan ke sini.
*
* @param record Deskripsi peristiwa log. catatan null diabaikan begitu saja
* dan tidak ada pemberitahuan yang akan dikirim.
*/
publikasi kekosongan publik (catatan LogRecord) {
super.publish(catatan);
menyiram();
}
/**
* Ganti StreamHandler.close untuk menyiram, tapi
* Aliran keluaran tidak ditutup. Dengan kata lain, System.err tidak ditutup.
*/
kekosongan publik tutup() {
menyiram();
}
}
}