Java4u
Monday, 3 May 2021
Request Body only once
package com.example.demo.config;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.filters.RequestFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.apache.log4j.Logger;
@Component
public class CustomFilter implements Filter{
private static final Logger LOGGER = Logger.getLogger(RequestFilter.class);
@Autowired
LogApiInterceptor logApiInterceptor;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
LOGGER.info("doFilter, parsing request");
// LOG REQUEST
ResettableStreamHttpServletRequest wrappedRequest = null;
try {
wrappedRequest = new ResettableStreamHttpServletRequest((HttpServletRequest) request);
logApiInterceptor.writeRequestPayloadAudit(wrappedRequest);
} catch (Exception e) {
LOGGER.error("Fail to wrap request and response",e);
}
chain.doFilter(wrappedRequest, response);
}
}
-----------------------------------------------------------------------------------------------------------------
package com.example.demo.config;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Enumeration;
import java.lang.StringBuffer;
import java.io.Writer;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.FileOutputStream;
import java.util.Collections;
import java.nio.charset.StandardCharsets;
import java.io.IOException;
import org.springframework.stereotype.Component;
import org.apache.log4j.Logger;
import java.util.UUID;
@Component
public class LogApiInterceptor extends HandlerInterceptorAdapter {
private static final Logger LOGGER = Logger.getLogger(LogApiInterceptor.class);
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
public String getRawHeaders(HttpServletRequest request) {
StringBuffer rawHeaders = new StringBuffer();
Enumeration headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);
rawHeaders.append(key).append(":").append(value).append("\n");
}
System.out.println("Testing :::::: "+rawHeaders.toString());
return rawHeaders.toString();
}
public String getRawHeaders(HttpServletResponse response){
StringBuffer rawHeaders = new StringBuffer();
Enumeration headerNames = Collections.enumeration(response.getHeaderNames());
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = response.getHeader(key);
rawHeaders.append(key).append(":").append(value).append("\n");
}
return rawHeaders.toString();
}
private void writePayloadAudit(String payloadFile, String rawHeaders, String requestBody) throws IOException {
try (Writer writer = new BufferedWriter(
new OutputStreamWriter(new FileOutputStream(payloadFile), StandardCharsets.UTF_8))) {
writer.write(rawHeaders);
writer.write("\n");
writer.write(requestBody);
}
}
public void writeRequestPayloadAudit(ResettableStreamHttpServletRequest wrappedRequest) {
try {
String requestHeaders = getRawHeaders(wrappedRequest);
String requestBody = org.apache.commons.io.IOUtils.toString(wrappedRequest.getReader());
LOGGER.info("Request Method: "+wrappedRequest.getMethod());
LOGGER.info("Request Headers:");
LOGGER.info(requestHeaders);
LOGGER.info("Request body:");
LOGGER.info(requestBody);
} catch (Exception e) {
LOGGER.error(e);
}
}
}
-----------------------------------------------------------------------------------------------------------------------------
package com.example.demo.config;
import javax.servlet.ServletInputStream;
import java.io.InputStream;
import javax.servlet.ReadListener;
import java.io.IOException;
public class ResettableServletInputStream extends ServletInputStream {
public InputStream inputStream;
private ServletInputStream servletInputStream = new ServletInputStream(){
boolean isFinished = false;
boolean isReady = true;
ReadListener readListener = null;
public int read() throws IOException {
int i = inputStream.read();
isFinished = i == -1;
isReady = !isFinished;
return i;
}
@Override
public boolean isFinished() {
return isFinished;
}
@Override
public boolean isReady() {
return isReady;
}
@Override
public void setReadListener(ReadListener readListener) {
this.readListener = readListener;
}
};
public int available() throws IOException {
return inputStream.available();
}
public void close() throws IOException {
inputStream.close();
}
public void mark(int readLimit){
inputStream.mark(readLimit);
}
public boolean markSupported(){
return inputStream.markSupported();
}
public int read(byte[] b, int off, int len) throws IOException {
return inputStream.read(b,off,len);
}
public int readline(byte[] b, int off, int len) throws IOException {
if ( len <= 0 ){
return 0;
}
int count=0,c;
while ( (c = read()) != -1 ) {
b[off++] = (byte) c;
count++;
if ( c == '\n' || count == len ) {
break;
}
}
return count > 0 ? count : -1;
}
public void reset() throws IOException {
inputStream.reset();
}
public long skip(long n) throws IOException {
return inputStream.skip(n);
}
@Override
public int read() throws IOException {
return inputStream.read();
}
@Override
public void setReadListener(ReadListener readListener){
servletInputStream.setReadListener(readListener);
}
public boolean isReady() {
return servletInputStream.isReady();
}
public boolean isFinished() {
return servletInputStream.isFinished();
}
}
--------------------------------------------------------------------------------------------------------------------
package com.example.demo.config;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.IOException;
import java.io.ByteArrayInputStream;
import org.apache.commons.io.IOUtils;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import javax.servlet.ServletInputStream;
public class ResettableStreamHttpServletRequest extends HttpServletRequestWrapper {
private byte[] rawData = {};
private HttpServletRequest request;
private ResettableServletInputStream servletStream;
public String requestId;
public String payloadFilePrefix;
public String payloadTarget;
ResettableStreamHttpServletRequest(HttpServletRequest request) throws IOException {
super(request);
this.request = request;
this.servletStream = new ResettableServletInputStream();
}
void resetInputStream() throws IOException {
initRawData();
servletStream.inputStream = new ByteArrayInputStream(rawData);
}
private void initRawData() throws IOException {
if ( rawData.length == 0 ) {
byte[] b = IOUtils.toByteArray(this.request.getInputStream());
if ( b != null )
rawData = b;
}
servletStream.inputStream = new ByteArrayInputStream(rawData);
}
@Override
public ServletInputStream getInputStream() throws IOException {
initRawData();
return servletStream;
}
public BufferedReader getReader() throws IOException {
initRawData();
String encoding = getCharacterEncoding();
if ( encoding != null ) {
return new BufferedReader(new InputStreamReader(servletStream, encoding));
} else {
return new BufferedReader(new InputStreamReader(servletStream));
}
}
}
-------------------------------------------------------------------------------------------------------------
package com.example.demo.config;
import javax.servlet.http.HttpServletResponse;
public class ResettableStreamHttpServletResponse {
public ResettableStreamHttpServletResponse(HttpServletResponse response) {
// TODO Auto-generated constructor stub
}
}
------------------------------------------------------------------------------------------------------------------
package com.example.demo;
import java.util.concurrent.atomic.AtomicLong;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping(value = "/greeting", method = { RequestMethod.GET, RequestMethod.POST })
public Greeting greeting(@RequestBody String latestName, @RequestParam(value = "name", defaultValue = "World") String name) {
System.out.println("calling"+latestName);
return new Greeting(counter.incrementAndGet(), String.format(template, latestName));
}
}
--------------------------------------------------------------------------------------------------------------------
package com.example.demo;
public class Greeting {
private final long id;
private final String content;
public Greeting(long id, String content) {
this.id = id;
this.content = content;
}
public long getId() {
return id;
}
public String getContent() {
return content;
}
}
----------------------------------------------------------------------------------------------------------------------
# Root logger option
log4j.rootLogger=INFO, stdout
# Direct log messages to stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
-----------------------------------------------------------------------------------------------------------------------
Tuesday, 21 July 2015
-
Creation and initialization
The container first creates the servlet instance and then executes the init() method.
init() can be called only once in its life cycle by the following ways:
a) Through the ‘load-on-startup’ tag using the web.xml. This makes the servlet to be loaded and initialized when the server starts.
b) For the first time only in its life cycle, just before the service() is invoked.
c) Server administrator can request for the initialization of a servlet directly. -
Execution of service
Whenever a client requests for the servlet, everytime the service() method is invoked during its life cycle. From service() then it is branched to the doGet() or doXx..() methods for a HttpServlet. The service() method should contain the code that serves the Servlet purpose. -
Destroy the servlet
destroy() method is invoked first, then Servlet is removed from the container and then eventually garbage collected. destroy() method generally contains code to free any resources like jdbc connection that will not be garbage collected.
Monday, 24 November 2014
Subscribe to:
Comments (Atom)