您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何从POST请求中获取XML并在Servlet过滤器中对其进行修改?

如何从POST请求中获取XML并在Servlet过滤器中对其进行修改?

您不能两次使用InputStream,需要创建一个包装类,以保留InputStream的可重复副本。

public class ReadTwiceHttpServletRequestWrapper extends HttpServletRequestWrapper {

private ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

public ReadTwiceHttpServletRequestWrapper(HttpServletRequest request) {
    super(request);
    try {
        IoUtils.copy(request.getInputStream(), outputStream);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

@Override
public BufferedReader getReader() throws IOException {
    return new BufferedReader(new InputStreamReader(new ByteArrayInputStream(outputStream.toByteArray())));
}

@Override
public ServletInputStream getInputStream() throws IOException {
    final ByteArrayInputStream inputStream = new ByteArrayInputStream(outputStream.toByteArray());
    return new ServletInputStream() {

        @Override
        public int readLine(byte[] b, int off, int len) throws IOException {
            return inputStream.read(b, off, len);
        }

        @Override
        public boolean isFinished() {
            return inputStream.available() > 0;
        }

        @Override
        public boolean isReady() {
            return true;
        }

        @Override
        public void setReadListener(ReadListener arg0) {
            // TODO Auto-generated method stub
        }

        @Override
        public int read() throws IOException {
            return inputStream.read();
        }
    };
}

public void setBody(String body) {
    outputStream = new ByteArrayOutputStream();
    try {
        outputStream.write(body.getBytes());
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

public String getBody() {
    return new String(outputStream.toByteArray());
}

}

然后,您需要使用链中第一个过滤器进行初始化。

public class ReadTwiceFilter implements Filter {

@Override
public void destroy() {
}

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

    ReadTwiceHttpServletRequestWrapper readTwiceHttpServletRequestWrapper = new ReadTwiceHttpServletRequestWrapper(
            (HttpServletRequest) request);

    String newBody = readTwiceHttpServletRequestWrapper.getBody().replace("<soap:studentId>1</soap:studentId>", "<soap:studentId>2</soap:studentId>");
    readTwiceHttpServletRequestWrapper.setBody(newBody);

    chain.doFilter(readTwiceHttpServletRequestWrapper, response);
}

@Override
public void init(FilterConfig arg0) throws ServletException {
}

}

Jave 2022/1/1 18:17:10 有377人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶