你好我一直在试图找出在我的应用程序中记录http请求的通用方法,到目前为止没有运气,这是我现在如何处理日志记录,即:
@RequestMapping(value="register", method = RequestMethod.POST)
@ResponseBody
public String register(@RequestParam(value="param1",required=false) String param1, @RequestParam("param2") String param2, @RequestParam("param3") String param3, HttpServletRequest request){
long start = System.currentTimeMillis();
logger.info("!--REQUEST START--!");
logger.info("Request URL: " + request.getRequestURL().toString());
List<String> requestParameterNames = Collections.list((Enumeration<String>)request.getParameterNames());
logger.info("Parameter number: " + requestParameterNames.size());
for (String parameterName : requestParameterNames){
logger.info("Parameter name: " + parameterName + " - Parameter value: " + request.getParameter(parameterName));
}
//Some processing logic, call to the various services/methods with different parameters, response is always String(Json)
String response = service.callSomeServiceMethods(param1,param2,param3);
logger.info("Response is: " …Run Code Online (Sandbox Code Playgroud) 我正在尝试为我的Web应用程序创建请求日志.我使用Spring 3. 0.
我实现了一个扩展类,HandlerInterceptorAdapter并使用它preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)来拦截请求.
在方法中,我希望能够记录请求体(我的参数是XML中直接写入请求体的对象),并且我使用 request.getReader();
问题是 - 稍后我会IllegalStateException在弹簧控制器尝试读取请求时得到一个.
有办法做我想做的事吗?
我们有一个 Spring 方法来处理 REST 调用,但根据我们使用的客户端(浏览器与移动应用程序),我们遇到了一些问题。我们希望能够看到原始请求和标头,但无法弄清楚如何轻松做到这一点。我们想出的最好的方法是将 添加到HttpServletRequest方法中的参数中,并创建一个长方法来打印请求对象的各个部分。有没有更好的方法,比如为某些特定的 Spring 类打开调试日志记录org.springframework.web.*?
我们的方法的编辑版本和printRequestInfo()方法是:
@RequestMapping(method = RequestMethod.POST, value = "/test/{testId}")
public void doSomething(@PathVariable Long testId,
@RequestParam(value = "someOtherParam", required = false) String someOtherParam,
HttpServletRequest req)
{
printRequestInfo(req);
// ...
}
private void printRequestInfo(HttpServletRequest req) {
StringBuffer requestURL = req.getRequestURL();
String queryString = req.getQueryString();
if (queryString == null) {
logger.info("url: " + requestURL.toString());
} else {
logger.info("url: " + requestURL.append('?').append(queryString).toString());
}
logger.info( "method:" + req.getMethod());
// print all the headers …Run Code Online (Sandbox Code Playgroud) 在春天,我有一个带有端点的控制器,如下所示:
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public OutputStuff createStuff(@RequestBody Stuff stuff) {
//my logic here
}
Run Code Online (Sandbox Code Playgroud)
这样,如果在此端点上执行 POST,请求正文中的 JSON 将自动反序列化为我的模型 ( Stuff)。问题是,我只是需要在原始 JSON 传入时记录它!我尝试了不同的方法。
HttpServletRequest入createStuff读体内有和日志:代码:
@RequestMapping(method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
@ResponseBody
public OutputStuff createStuff(@RequestBody Stuff stuff, HttpServletRequest req) {
StringBuilder sb = new StringBuilder();
req.getReader().getLines().forEach(line -> {
sb.append(line);
});
//log sb.toString();
//my logic here
}
Run Code Online (Sandbox Code Playgroud)
问题在于,当我执行此操作时,读取器的 InputStream 已被执行以将 JSON 反序列化为Stuff. 所以我会得到一个错误,因为我不能两次读取相同的输入流。
HandlerInterceptorAdapter将在调用实际处理程序之前记录原始 JSON 的自定义。 代码(部分):
public class RawRequestLoggerInterceptor extends HandlerInterceptorAdapter { …Run Code Online (Sandbox Code Playgroud)