热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java获取postxml,java–如何从POST请求中获取XML并在ServletFilter中修改它?

我目前正在处理一个需求,我需要在请求到达Spring控制器之前在servlet过滤器中获取XML(来自POST请求),然后我需要处理XML(切断一些空节点元素)过滤,然后呼叫应继续

我目前正在处理一个需求,我需要在请求到达Spring控制器之前在servlet过滤器中获取XML(来自POST请求),然后我需要处理XML(切断一些空节点/元素)过滤,然后呼叫应继续进行.

我尝试了下面的代码(只附加了代码片段),我能够获取请求体(XML)并能够设置修改后的响应.

HttpServletRequest httpRequest = (HttpServletRequest) request;

HttpServletResponse httpResponse = (HttpServletResponse) response;

if (httpRequest.getMethod().equalsIgnoreCase("POST")) {

extractDataFromRequest(httpRequest);

httpResponse.getWriter().write("");

}

chain.doFilter(request, wrappedResponse);

public static String extractDataFromRequest(HttpServletRequest request) throws IOException {

String line;

StringBuilder builder = new StringBuilder();

BufferedReader reader = request.getReader();

while ((line = reader.readLine()) != null) {

builder.append(line);

}

return builder.toString();

}

但是,spring因以下异常而失败.

Severe: java.lang.IllegalStateException: PWC3997: getReader() has already been called for this request

at org.apache.catalina.connector.Request.getInputStream(Request.java:1178)

at org.apache.catalina.connector.RequestFacade.getInputStream(RequestFacade.java:407)

at org.springframework.http.server.ServletServerHttpRequest.getBody(ServletServerHttpRequest.java:165)

at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.readWithMessageConverters(RequestResponseBodyMethodProcessor.java:120)

at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.resolveArgument(RequestResponseBodyMethodProcessor.java:100)

我正在寻找专家对此要求的具体实施.

解决方法:

您不能两次使用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("1", "2");

readTwiceHttpServletRequestWrapper.setBody(newBody);

chain.doFilter(readTwiceHttpServletRequestWrapper, response);

}

@Override

public void init(FilterConfig arg0) throws ServletException {

}

}

标签:java,spring,spring-mvc,servlets,servlet-filters

来源: https://codeday.me/bug/20191003/1846690.html



推荐阅读
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • Explore a common issue encountered when implementing an OAuth 1.0a API, specifically the inability to encode null objects and how to resolve it. ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 使用 Azure Service Principal 和 Microsoft Graph API 获取 AAD 用户列表
    本文介绍了一段通用代码示例,该代码不仅能够操作 Azure Active Directory (AAD),还可以通过 Azure Service Principal 的授权访问和管理 Azure 订阅资源。Azure 的架构可以分为两个层级:AAD 和 Subscription。 ... [详细]
  • PHP 5.2.5 安装与配置指南
    本文详细介绍了 PHP 5.2.5 的安装和配置步骤,帮助开发者解决常见的环境配置问题,特别是上传图片时遇到的错误。通过本教程,您可以顺利搭建并优化 PHP 运行环境。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 深入解析Spring Cloud Ribbon负载均衡机制
    本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
  • 在维护公司项目时,发现按下手机的某个物理按键后会激活相应的服务,并在屏幕上模拟点击特定坐标点。本文详细介绍了如何使用ADB Shell Input命令来模拟各种输入事件,包括滑动、按键和点击等。 ... [详细]
  • 本文详细介绍了美国最具影响力的十大财团,包括洛克菲勒、摩根、花旗银行等。这些财团在历史发展过程中逐渐形成,并对美国的经济、政治和社会产生深远影响。 ... [详细]
  • 图数据库中的知识表示与推理机制
    本文探讨了图数据库及其技术生态系统在知识表示和推理问题上的应用。通过理解图数据结构,尤其是属性图的特性,可以为复杂的数据关系提供高效且优雅的解决方案。我们将详细介绍属性图的基本概念、对象建模、概念建模以及自动推理的过程,并结合实际代码示例进行说明。 ... [详细]
  • 深入解析 Spring Security 用户认证机制
    本文将详细介绍 Spring Security 中用户登录认证的核心流程,重点分析 AbstractAuthenticationProcessingFilter 和 AuthenticationManager 的工作原理。通过理解这些组件的实现,读者可以更好地掌握 Spring Security 的认证机制。 ... [详细]
  • 探讨如何真正掌握Java EE,包括所需技能、工具和实践经验。资深软件教学总监李刚分享了对毕业生简历中常见问题的看法,并提供了详尽的标准。 ... [详细]
  • 本文介绍如何使用 Python 将一个字符串按照指定的行和元素分隔符进行两次拆分,最终将字符串转换为矩阵形式。通过两种不同的方法实现这一功能:一种是使用循环与 split() 方法,另一种是利用列表推导式。 ... [详细]
  • 本文介绍了在安装或运行 Python 项目时遇到的 'ModuleNotFoundError: No module named setuptools_rust' 错误,并提供了解决方案。 ... [详细]
author-avatar
一抺晚霞_769
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有