大黄瓜de冬天 2021-04-13 19:46 采纳率: 88.9%
浏览 141
已采纳

java.lang.IllegalStateException: 不允许修改锁定的参数映射

看了挺多文章,貌似都不是我的答案。

第三方平台访问项目接口,项目用tomcat8发布到云服务器上,用postman本地测试云服务器没有问题

开始,以为是跨域问题,尝试加@CrossOrigin注解,然而问题依旧。

 

  • 写回答

1条回答 默认 最新

  • 大黄瓜de冬天 2021-04-14 13:53
    关注

    此问题已解决,问题的解决主要还是重现了此错误,并debug到问题所在。在本地运行时没有问题的,没有往代码错误这个事情上去想,另外查看日志也因为错误的行数导致错误真正的错误行数。

    废话真多,哈哈,自己以后要注意。

    为了重现这个错误,首先跟第三方要了请求代码的文件,去掉所有拦截器的注解,在本地运行了一次,重现了问题并解决。那么为什么本地运行没有问题,到服务器就有问题了呢?那是因为用HttpServletRequest请求的getParameterMap方法在跨域(本地运行时没有跨域的)访问的时候,通过源码可知会对HashMap多了一个锁定的属性,这是tomcat以及很多工具为了遵守游览器的同源策略,如果缺少了同源策略,浏览器很容易受到XSS、CSFR等攻击。所谓同源是指"协议+域名+端口"三者相同,即便两个不同的域名指向同一个ip地址,也非同源。

    那么知道了问题所在,解决起来就很简单了。

    根据网上文章找到以下解决方式。

    第一种跨域注解@CrossOrigin或者写拦截器。具体本文就不介绍了,因为没有解决我的问题。

    第二种重写getParameterMap方法,这个也感觉本来如果重写了,等于放弃了同源策略,是不是很容易受到攻击,所以没有尝试。

    第三种反射到锁定属性,并改值,接触锁定。也没尝试

    第四种在获取getParameterMap方法的结果后,不要直接去put(我就是为了好看,有个地方put了)或者非要put,自己定义一个map接收getParameterMap方法的值,作下转换,自然put的锁定就不存在了。

    以上就是我遇到问题后整体解决方案。(过程更复杂一点,为自己的无知感到愧疚)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000
  • ¥30 ppOCRLabel导出识别结果失败
  • ¥15 Centos7 / PETGEM
  • ¥15 csmar数据进行spss描述性统计分析
  • ¥15 各位请问平行检验趋势图这样要怎么调整?说标准差差异太大了
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 wpf界面一直接收PLC给过来的信号,导致UI界面操作起来会卡顿
  • ¥15 init i2c:2 freq:100000[MAIXPY]: find ov2640[MAIXPY]: find ov sensor是main文件哪里有问题吗