相关疑难解决方法(0)

如何使用Spring MVC正确记录http请求

你好我一直在试图找出在我的应用程序中记录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)

java logging spring spring-mvc

38
推荐指数
4
解决办法
5万
查看次数

记录HttpRequest参数和请求正文

我正在尝试为我的Web应用程序创建请求日志.我使用Spring 3. 0.

我实现了一个扩展类,HandlerInterceptorAdapter并使用它preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)来拦截请求.

在方法中,我希望能够记录请求体(我的参数是XML中直接写入请求体的对象),并且我使用 request.getReader();

问题是 - 稍后我会IllegalStateException在弹簧控制器尝试读取请求时得到一个.

有办法做我想做的事吗?

java spring-mvc httprequest

10
推荐指数
1
解决办法
2万
查看次数

如何记录 Spring @RestController @RequestMapping 方法的所有请求和标头信息?

我们有一个 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)

java rest spring request

6
推荐指数
1
解决办法
1万
查看次数

Spring 读取请求体两次

在春天,我有一个带有端点的控制器,如下所示:

@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 传入时记录它!我尝试了不同的方法。

  1. 注射HttpServletRequestcreateStuff读体内有和日志:

代码:

@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. 所以我会得到一个错误,因为我不能两次读取相同的输入流。

  1. 使用HandlerInterceptorAdapter将在调用实际处理程序之前记录原始 JSON 的自定义。

代码(部分):

public class RawRequestLoggerInterceptor extends HandlerInterceptorAdapter { …
Run Code Online (Sandbox Code Playgroud)

logging spring spring-mvc

6
推荐指数
2
解决办法
1万
查看次数

标签 统计

java ×3

spring ×3

spring-mvc ×3

logging ×2

httprequest ×1

request ×1

rest ×1