tomcat 参数无法传递问题

最近在做java web项目时,使用post方式提交form表单,后台无论如何都无法接受到参数。下面是对错误的描述:

下面是项目文件目录结构:


在login.jsp中表单见下图:



       使用该表单向后台提交数据时,无论如何后台都收不到表单项值,使用tomcat版本是7.0.54。

不知道高手看到这里,能不能找出问题的原理?

       百度各种搜索资料,也没有遇到相似的问题。后来,我们使用tomcat8版本重新部署该项目,发现没有出现该问题,说明后台能够收到表单的内容。到这里,虽然问题解决了,但是问题出现的根本原理并没有找到,作为一个技术研究者,总是希望探索问题根本缘由。

      首先第一步,我对tomcat7.0.54版本以上tomcat8以下的所有的tomcat进行了测试,发现从tomcat7.0.67版本开始,该问题不存在,7.0.67以前的版本都存在该问题。

      然后使用存在该问题的tomcat7.0.65(7.0.66版本官网没有)重新发布该项目,重新提交表单,然后使用google浏览器的network,查看请求和响应信息,见下图:


 请求状态是302,说明请求被重定向了。怪不得后台收不到表单的值,重定向后,第一次请求的request内容无法转到下一个请求中。为什么会出现重定向呢?

 到这一步,我还没有找到问题产生的根本原因,怎么办呢?就想去既然换了tomcat版本问题能够解决,就去tomcat官网查看,tomcat7.0.65以上的版本到底改变了哪些内容。虽然,tomcat7.0.66没有提供下载的版本,但是在changelog中却有相应的记录(tomcat7.0.66改变内容都体现在了7.0.67版本中),查看tomcat7.0.66和tomcat7.0.67版本的的changelog,发现有一个升级改变,见下图:


 由于英语水平有限,刚开始并不能完全理解红框内的意思,但是里面有几个关键词,defaultservlet、redirect等。而且,defaultservlet一般用作对静态资源的拦截处理,在项目中也正是如此,看上面的项目目录结构,发现有一个login文件夹,该文件夹中存放是js、css等静态文件。Login.jsp中表单提交的路径与login文件夹的请求路径是相同的!!!它们都是http://xxxx/login。到这里问题的原因已经找到了,看上面的红框内的一句:this enables such requests to be processed by any cifnigured valvesand filters before the redirect is made.也就是说,tomcat把login请求当成了静态资源请求交给了defaultservlet处理,由于login只是一个路径,并不是真正是资源文件,因此,在tomcat7.0.66以前的版本中,若找不到资源文件,就会把请求重定向,重定向后request中的内容肯定不会存在了,因此后台就接收不到form表单的内容;而在tomcat7.0.67及以后的版本中,defaultservlet把该请求当成一般的上下文请求,在重定向之前进行处理,因此,不会出现后台接收不到数据的现象。按照这个思路,我把login文件夹改成了其它的名称,问题果然得到了解决。

以上都是个人的理解,但是本人并没有分析过tomcat源码,因此对tomcat处理请求的原理,若有不对,希望各位给予改正。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章