相关疑难解决方法(0)

java.lang.IllegalStateException:已经为此请求调用了getReader()

我想将记录添加到我的Servlet中,所以我创建了Filter,它应该显示请求并转到Servlet.但不幸的是我遇到了异常:

java.lang.IllegalStateException: getReader() has already been called for this request
    at org.apache.catalina.connector.Request.getInputStream(Request.java:948)
    at org.apache.catalina.connector.RequestFacade.getInputStream(RequestFacade.java:338)
    at com.noelios.restlet.ext.servlet.ServletCall.getRequestEntityStream(ServletCall.java:190)
Run Code Online (Sandbox Code Playgroud)

所以为了解决这个问题,我找到了Wrapper的解决方案,但它不起作用.我还可以在代码中使用/更改什么?有任何想法吗?

[MyHttpServletRequestWrapper]

public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper
{
    public MyHttpServletRequestWrapper(HttpServletRequest request)
    {
        super(request);
    }

    private String getBodyAsString()
    {
        StringBuffer buff = new StringBuffer();
        buff.append(" BODY_DATA START [ ");
        char[] charArr = new char[getContentLength()];
        try
        {
            BufferedReader reader = new BufferedReader(getReader());
            reader.read(charArr, 0, charArr.length);
            reader.close();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        buff.append(charArr);
        buff.append(" ] BODY_DATA END ");
        return buff.toString();
    }

    public String toString()
    { …
Run Code Online (Sandbox Code Playgroud)

java servlets servlet-filters

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

使用 ContentCachingRequestWrapper 导致空参数映射

我已经实现了一个过滤器,我想先读取请求的内容进行一些检查,然后再继续。

但问题是,在过滤器链的以下过滤器中,调用的是getParameters()Method fromclass Request (org.eclipse.jetty.server.Request)而不是getParameters()from的方法class ContentCachingRequestWrapper。所以parametersMap没有被填满,总是空的。

这是我的代码的样子:

@Component
@Order(1)
public class EncodingFilter extends GenericFilterBean {

private static final Logger LOG = 
LoggerFactory.getLogger(EncodingFilter.class);

@Override
public void doFilter(ServletRequest request, ServletResponse response, 
FilterChain chain) throws IOException, ServletException {

final HttpServletRequest req = (HttpServletRequest) request;
HttpServletRequest servletRequest = new ContentCachingRequestWrapper(req);

String read = ByteSource.wrap(ByteStreams.toByteArray(servletRequest.getInputStream()))
        .asCharSource(StandardCharsets.UTF_8).read();
// Doing analysis .....
// last step call filter chain
chain.doFilter(servletRequest, response);
}
}
Run Code Online (Sandbox Code Playgroud)

在控制器中:

@PostMapping(
    value = Endpoints.Janus.INIT, …
Run Code Online (Sandbox Code Playgroud)

java spring embedded-jetty

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

如何在Spring过滤器中获取请求体参数?

我想通过Spring过滤器或aspect记录HTTP请求中的请求参数。我尝试了不同的方法,但要么请求参数被调用null,要么方法未被调用。

我正在使用 Postman,这是一个POST请求。


示例请求网址:

http://localhost:8080/AvailableData

请求正文示例:

{
    "keyUserAgent": "CFNetwork/1209 Darwin/20.2.0",
    "locale": "en_US",
    "eid": "8904977033",
    "sessionId": "VGA-G20201030-776878787-1AD5-11EB-895C-H78789GJJH"
}
Run Code Online (Sandbox Code Playgroud)

选项1

这里调用@Override的方法beforeRequest(),但不会调用我创建的重载方法(我添加了@RequestBody按照其他解决方案获取正文)。

{
    "keyUserAgent": "CFNetwork/1209 Darwin/20.2.0",
    "locale": "en_US",
    "eid": "8904977033",
    "sessionId": "VGA-G20201030-776878787-1AD5-11EB-895C-H78789GJJH"
}
Run Code Online (Sandbox Code Playgroud)

选项2

在这里它是这样的null:

@Component
public class CustomLoggingFilter extends AbstractRequestLoggingFilter {

    protected void beforeRequest(HttpServletRequest request, String message, @RequestBody RequestDTO requestBody) {
        requestBody.getKeyUserAgent();
        requestBody.getEid();
        System.out.println("Eid: " + requestBody.getEid());
        System.out.println("getKeyUserAgent: " + requestBody.getKeyUserAgent());
    }

}
Run Code Online (Sandbox Code Playgroud)

java spring request http-request-parameters spring-boot

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