webwork上传异常分析:getReader() or getInputStream() call

在使用webwork-2.2.4.jar,xwork-1.2.1.jar时文件上传发生异常.

00:29:07.390 ERROR! [SocketListener0-1] com.opensymphony.webwork.dispatcher.DispatcherUtils.prepare(DispatcherUtils.java:394) >17> Error setting character encoding to 'UTF-8' - ignoring.
java.lang.IllegalStateException: getReader() or getInputStream() called
 at org.mortbay.jetty.servlet.ServletHttpRequest.setCharacterEncoding(ServletHttpRequest.java:602)
 at javax.servlet.ServletRequestWrapper.setCharacterEncoding(ServletRequestWrapper.java:105)
 at com.opensymphony.webwork.dispatcher.DispatcherUtils.prepare(DispatcherUtils.java:392)
 ...

 
分析源码如下:
com.opensymphony.webwork.dispatcher.DispatcherUtils.java:394

 String encoding = null;
        if (Configuration.isSet(WebWorkConstants.WEBWORK_I18N_ENCODING)) {
            encoding = Configuration.getString(WebWorkConstants.WEBWORK_I18N_ENCODING);
        }
 Locale locale = null;
        if (Configuration.isSet(WebWorkConstants.WEBWORK_LOCALE)) {
            locale = LocalizedTextUtil.localeFromString(Configuration.getString(WebWorkConstants.WEBWORK_LOCALE), request.getLocale());
        }

        if (encoding != null && !MultiPartRequest.isMultiPart(request)) {
            try {
                request.setCharacterEncoding(encoding);
            } catch (Exception e) {
                LOG.error("Error setting character encoding to '" + encoding + "' - ignoring.", e);
            }
        }

 
webwork.properties

 webwork.locale=en_US
 webwork.i18n.encoding=UTF-8

 
文件上传经过控制层处理时,得到的文件file对象,文件类型ContentType,文件名FileName都是正确的,文件名中文显示正常.

为了避免上面webwork抛出的异常,我们可以使用低版本的webwork(webwork-2.2.2.jar,xwork-1.1.3.jar)
运行程序之后系统没有抛出"java.lang.IllegalStateException: getReader() or getInputStream() called",但是文件名如果是中文为乱码,
为了解决文件名中文乱码问题,我们可以采取两种简单的处理方法:
  //方法一:获取文件后缀名
  //优点:使用RandomStringUtils随机生成10位字符为文件名,可以避免上传后存在文件名同名情况

  int idx = file4FileName.indexOf(".");
  String suffix = fileFileName.substring(idx);
  System.out.println(suffix);
  String prefix = org.apache.commons.lang.RandomStringUtils.randomAlphabetic(10);
  String filename = prefix + suffix;
  System.out.println(filename);
  fileFileName = filename;

 
  
  //方法二:字符串转码
  //使用上传的文件名,将乱码中文名转码(UTF-8),

  String filename2 = new String(fileFileName.getBytes(),"UTF-8");
  System.out.println("filename2:"+filename2);
  fileFileName = filename2;

 
将该问题解决。(注:默认已使用webwork上传图片而出现上面异常时分析,具体上传代码略)

 

Wireshark抓包实战:5个CTF比赛中高频出现的流量分析技巧(附真实案例) 本文分享了Wireshark在CTF比赛和实战渗透中的五个核心流量分析技巧。内容涵盖从宏观统计概览锁定可疑目标、深度解析ICMP与HTTP等协议、追踪重组完整会话流,到利用字符串搜索和命令行工具进行自动化分析。掌握这些高阶技巧能显著提升分析海量网络流量的效率与精准度。 阅读详情

相关推荐

DroidGuard虚拟机逆向解析:指令集、密钥派生与反调试机制

DroidGuard是Google在Android生态中部署的轻量级定制虚拟机,用于设备完整性校验。其核心原理是通过自解释字节码、多层混淆指令集与动态密钥派生机制,在ART运行时构建静默安全沙箱。技术价值在于规避传统API检测盲区,实现高鲁棒性环境感知;典型应用场景包括金融SDK风控、Play Services可信启动及合规性审计。本文深入拆解其4字节指令编码规则、基于设备指纹的三阶段密钥派生(SHA256→Feistel→AES)、以及五层反调试体系(ptrace快照、时间差分、内存页探测、指令流校验、服

weixin_32736961的博客 587

java stream 多次读取_java – 如何读取InputStream多次

我有这个代码:@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {logger.info("Filter start...");HttpServletRequest httpReq...

weixin_36102010的博客 745

从动态规划到最优控制:Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用

本文深入解析了Hamilton-Jacobi-Bellman (HJB) 方程的核心思想与应用,从动态规划到最优控制的演变过程。通过实际案例展示了HJB方程在机器人路径规划、工业机械臂优化等领域的实践价值,并探讨了数值求解方法和深度学习结合的神经HJB前沿进展。

weixin_28700411的博客 456

解决getInputStream()和getReader()只能调用一次问题

最近在项目开发中,需要记录请求日志,刚开始ContentType的类型都是application/x-www-form-urlencoded这种,所以我们在获取请求记录时,可以通过如下方式获取 Enumeration<?> temp = request.getParameterNames(); String params_json = ""; if (null != temp) { while (temp.hasM

xcc_2269861428的博客 2580

Python 实现生命游戏及进化模拟完整指南

生命模拟是进化计算的一个特定子集,模拟了自然界中所观察到的自然过程,例如粒子或鸟群的聚集方式。生命模拟只是用来探索和优化问题的模拟形式之一,还有很多其他形式的模拟,可以更好地建模各种过程,但它们都源于康威生命游戏 (Conway’s Game of Life)。在本节中,我们将介绍生命模拟的基本概念,并使用 Python 实现康威生命游戏。

盼小辉丶的博客 7万+

【毕设级教程】从0到1实现基于YOLOv8的UA-DETRAC交通目标检测系统(含UI界面,助力智能交通毕设)

本项目基于YOLOv8模型和UA-DETRAC数据集开发了一个交通目标检测系统,包含数据处理、模型训练和可视化界面全流程。UA-DETRAC数据集包含多种交通场景下的车辆标注,通过格式转换适配YOLOv8训练要求。系统采用PyQt开发交互界面,支持图像检测、结果显示等功能。该项目技术路线清晰,既展现深度学习在智能交通中的应用,又提供完整的可视化展示方案,适合作为计算机视觉相关毕业设计选题。

m0_64661770的博客 150

解决HttpServletRequest 流数据不可重复读

https://www.cnblogs.com/Sinte-Beuve/p/13260249.html 前言 在某些业务中可能会需要多次读取 HTTP 请求中的参数,比如说前置的 API 签名校验。这个时候我们可能会在拦截器或者过滤器中实现这个逻辑,但是尝试之后就会发现,如果在拦截器中通过getInputStream()读取过参数后,在 Controller 中就无法重复读取了,会抛出以下几种异常: HttpMessageNotReadableException: Required reques..

thulium_kyg的博客 1974

Claude Code 错误解决方案 API Error: 前缀通用错误

本文分析了Claude Code与Anthropic API通信时出现的通用错误处理问题。当API返回未分类错误时,系统会直接显示"API Error: "前缀的原始错误信息。通过错误链路追踪发现,这是由于未匹配特定错误类型时触发了通用兜底处理逻辑。文章提供了三种解决方案:查看具体错误内容、启用调试日志以及提交问题反馈,并建议用户关注错误码、使用/compact命令处理上下文超限问题。最后强调这些未分类错误是预期行为,用户应通过错误消息中的线索自行排查或反馈开发者。

多媒体编程、网络编程、系统编程、网络安全编程、驱动编程 1349

getParameter()、getInputStream()和getReader() 三者的区别

getParameter()、getInputStream()和getReader() 三者都是从selvlet中request对象中得到提交的数据,但是用途不同。要根据表单提交数据的编码方式选择不同的方法。 ...

星空下的承诺L的博客 3990

构网型逆变器下垂控制与电流限幅策略研究:理论、仿真与代码实现

随着分布式发电和微电网技术的快速发展,构网型(Grid-Forming, GFM)逆变器因其能够自主建立电压和频率参考、支撑弱电网及孤岛运行而受到广泛关注。本文提出并实现了一种基于下垂控制的构网型逆变器控制策略,将逆变器等效为受控电压源,通过L型滤波器接入配电网。在公共耦合点(PCC)处实时测量三相电压和电流,计算有功和无功功率,进而采用P-w和Q-V下垂控制生成内部频率和电压幅值,合成三相参考电压。针对故障情况下过电流问题,设计了一种自适应电流限幅模块:当电流幅值超过设定上限时,动态降低电压参考系数k_s

huanghm88的专栏 156

基于Simulink的MIMO-OFDM系统仿真建模示例

MIMO概述MIMO技术利用多个天线进行信号发送和接收,通过空间复用来提高数据传输速率,或通过空间分集来增强信号的可靠性。OFDM概述OFDM是一种将高速率数据流分成多个低速数据流并行传输的技术,每个子载波都采用调制方式(如BPSK、QPSK),并通过IFFT/FFT变换实现串并转换。MIMO-OFDM优势结合了MIMO的空间分集增益与OFDM对抗多径效应的能力,适用于宽带无线通信系统。提供了更高的数据速率和更好的频谱效率,是现代无线通信标准(如4G LTE、5G NR等)的核心技术之一。

xiaoheshang_123的博客 327

getReader()/getInputStream() has already been called for this request

getReader()/getInputStream() has already been called for this request 项目中需要在filter对request中body中的数据进行处理,发现了这个问题 getRead() has already been called for this request/getInputStream() has already been called for this request 根本原因是 request中的getRead() 和 getInput

qq_40161158的博客 634

如何用python自己复现worldquant brain中的回测结果

本文介绍了在Python中复现WorldQuant Brain平台上alpha 101因子1和4的回测框架构建要点。重点分析了Brain平台的策略设置:使用TOP 3000高流动性股票(可用中证1000/2000替代);delay=1表示t日信号在t+1日开盘调仓;详细解释了market/sector/industry/subindustry四级中性化方法;说明了decay参数控制持仓权重线性衰减;以及TRUNCATION参数限制单股仓位风险。文章还探讨了不同调仓时点的实现差异,为自主构建量化回测系统提供了

夏之微风的博客 735

Cannot call getReader(), getInputStream() already called分析与解决

Cannot call getReader(), getInputStream() already called分析与解决

zh_chong的博客 5865

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

getReader() is called by

filter中,当多次读取request流时,会报流已被读取的错:getReader() is called by …. 这是因为获取request流的方法是不容许被重复使用的,不同获取流的方法,一次请求中只能使用一次,getReader(),getInputStream(),所以,当我们需要在一次请求中使用同一种方法多次读取request流中的数据时,就需要对request进行封装,使其可以多次

小魔女的博客 1571

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SpringBoot报错:java.lang.IllegalStateException: getReader() has already been called for this request

报错情况如图所示,有多种情况可能导致这个问题,首先就是由于request中的输入流是同一个。因此你如果已经使用了inputstream,那么你就不能再使用getReader去获取流。先将原本的请求进行类型转换为HttpServletRequest,然后在使用ContentCachingRequestWrapper进行请求转换类型。我使用的就是这种方式,比较简单好用。

Zhangsama1的博客 2353

解决多次读取request输入流 : getInputStream/getReader() has already been called for this request

需求 实际开发中可能需要多次读取request中的输入流进行参数校验和修改,但HttpServletRequest是只能被读取一次 问题 public java.io.BufferedReader getReader() Throws: java.lang.IllegalStateException - if getInputStream() method has been...

FeelTouch Labs 1万+

getInputStream/getReader() has already been called for this request

getInputStream/getReader() has already been called for this request一、背景定义了一个安全校验过滤器,现在要获取请求参数。 通过request.getParameter获取请求参数,然而这种方式只能获取POST方式中的Content-Type: application/x-www-form-urlencoded。 通过request.

只有那些疯狂到认为自己可以改变世界的人,才可以真的改变世界 1万+

getReader() has already been called for this request 异常

ServletRequest的getReader()和getInputStream()两个方法只能被调用一次,而且不能两个都调用。那么如果Filter中调用了一次,在Controller里面就不能再调用了 会抛出异常:getReader() has already been called for this request异常 如果需要使用HttpServletRequest请求中的数据(记

noseew的博客 1万+

getParameter() getInputStream()和getReader() 区别

我们经常用servlet和jsp, 经常用request.getParameter() 来得到数据。request.getParameter() request.getInputStream() request.getReader() 这三个方法都是从request对象中得到提交的数据,但是用途不同。要根据表单提交数据的编码方式选择不同的方法。HTML中的form表单的一个关键属性 encty

小天一直在路上 2287

spring MVC 获取request中的body体

在项目中,客户端向服务端传送一组json数据,这组数据随着时间的推移可能会越来越大,可能会受到服务器对参数大小的限制的影响,因此,想直接将数据塞进request的body体中,继而发送给服务端,服务端直接将request中body 以流的方式读出来,并持久化。 HttpServletRequest类中有两个方法 getInputStream() 和request.getReader() ,本以为

田强强 4万+

web 文件上传以及getInputStream() has already been called for this request问题的解决

 效果图:  一、点击的按钮代码 &lt;button type="button" class="btn btn-default" onclick=""data-toggle="modal" data-target="#importExcelModel"&gt; &lt;i class="fa fa-cogs"&gt;&lt;/i&am

qq_38849721的博客 8738

java.lang.IllegalStateException: getOutputStream() has already been called for this response

写下载程序的时候,很多程序会报这种错误, 网上给的解决方案是在前端页面添加: out.clear(); //清空缓存的内容 out=pageContext.pushBody(); //更新PageContext的out属性的内容 但是对于一些情况下,只能后台处理: 在下载程序的结尾,对于文件的输出流添加.flush()方法即可,记住,一定需要在程序的最后添加 ...

menglixiazhiweizhi的博客 217

java.lang.IllegalStateException: getOutputStream() has already been called 解决办法

今天上班做从数据库查询图片到jsp页面显示,结果报java.lang.IllegalStateException: getOutputStream() has already been called 错误,折腾了将近半天的时间才弄出来。 在网上查阅了很多资料基本上都是一家之言,虽然说得都对,不过没有源码。所以我写下来供大家查阅。废话不多说,直接贴代码: 1、jsp页面(注:我用的是sp

mingyuanjava的专栏 2万+
上一篇: Java编码音乐播放器简化版
下一篇: maven部署web工程基础步骤
全新时代
博客等级 码龄19年 3粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值