你的位置:首页 > Java教程

[Java教程]一个${basePath}引发的血案


  前言:

   好久没有写博客了,上次发表博客还是在5月的时候,主要是4月多入职的新公司,5月份就开始做项目一直忙到这个月的中旬项目上线才偷得浮生半日闲,但是项目上线后客户还是隔三差五的提个问题,不是改BUG就是添加新的东西,本来想着一边看编程思想一边把每章的读后感写出来发出来的,但是天天忙着加班虽然也抽时间看到第15章了,但是读书笔记基本没写,最多就是会写一点思维导图,现在项目到结尾的部分了,还得继续看书写博客,以上全属于废话,下面进入今天的正文。

   问题描述:

  昨天下午客户打电话说有个功能不好使了,点击按钮保存的时候没反应,让赶紧解决一下,然后我就赶紧去看一下客户说出问题的地方,简单的说就是选择几个数据,然后弹出个窗口,在弹出的窗口中给选择的数据添加一些新的内容,然后保存,添加的东西可以是数据库中已有的,也可以是客户手动输入的,功能很简单,然后我就在我电脑上跑了一下,没出现客户说的的问题啊,然后就赶紧去找测试组的人,让他们再测一下这个问题,过了一会儿测试组的人过来说也没问题啊,这我就炸了,心想尼玛不是在逗我玩呢吧?然后用我们的账号登上了客户的系统,一看还真是不好使了,不管是选择已有的数据还是新添加数据,点击保存的时候都不好使,我了个去。

  解决过程:

  1.浏览器控制台看错误

    登不上客户的服务器,只能通过浏览器的控制台先看一下有没有问题?一看还真有问题,什么问题呢?

    

    length属性未定义,这是什么鬼?赶紧点进去看js代码,这里是一个异步请求,返回的是数据的数据,并且是一个数组,这下就郁闷了,返回的就是数组啊,数组不应该是有length属性的吗?你告诉我length       属性未定义是什么鬼?首先想到的是是不是浏览器不兼容啊,但是也不对啊,我用的是同样的浏览器,为毛访问我本地的就行但是访问客户的就不行了,这个可能被排除,然后,然后就下班了,想着今天来再解决         吧,回家坐车的时候还在想既然是length属性未定义,那么可不可以绕过去呢,不用length属性,因为是做for循环,那么能不能换成for-in循环来做呢?然后就想着今天早上再来试试;

  2.查看response结果

    早上来的时候本来是要实验一下昨天的想法的,但是早上突然灵机一动想到,是不是应该先看看服务器响应的结果是啥呢?如果响应的不是数组,那怎么会有length属性呢?到了公司就赶紧打开浏览器,熟练         的按下F12,点开NetWork,一看还真的是发现问题了,本来响应的应该是一个json数组([{},{},{}]),但是现在响应的是一个对象({},这就炸了,返回的是对象,怎么可能会有length属性嘛,不对啊,怎么       会返回一个对象呢,仔细看了一下,返回的对象里面有个msg属性,里面是有个<script>标签,标签里面是一个方法,还有一个success属性,结果是false,这尼玛不是系统里面用来后台向前台发送数据的时候用       的吗?然后在项目里面搜索一下msg中的那个方法,还真的找到了,这个方法主要作用是在用户没有登录直接访问系统时候直接跳转到登录页面,这又是什么鬼?怎么还牵扯到跳转登录页面了,继续苦逼的找问           题;

     3.确定问题

             系统中只有在没有登录的时候或者访问的路径不对的时候才会跳转到登录页,用有问题的url访问确实跳转登录页了,但是已经是登录过的了,那么排除没登录的问题,那就只能是URL出错了才会这样,然后仔细比对了一下没问题的URL和有问题的URL,终于发现了问题,尼玛谁多写了个项目名称,原来出问题的URL中多了一个项目名称,然后赶紧去看代码,有问题的URL在代码中是这么写的"/projectName/......",没问题的URL在代码中是这么写的"${basePath}/.......",但是这么写为什么在本地都没问题呢?仔细一看本地的URL,都是前一种,但是在客户服务器上的URL都是"域名:prot/....",这时候突然想到了以前用过虚拟域名,在tomcat的conf/sever.docBase = "项目真实路径/项目名称",到此终于发现了问题了根源了。

   4.解决办法

  既然发现问题了,那就好解决问题了,但是这时候大家肯定又疑问了,你标签是"${basePath}引发的血案",但是你的问题跟${basePath}有毛关系啊,小伙子你还是太年轻啊,因为"${basePath}/......."这种形式的路径获取到的就是项目的绝对路径,而且不管是部署在服务器上还是部署在本地都能获取到,但是如果你写的是"/projectName/......"这种路径,一旦项目名称或者说是文件夹名称改变,或者说就像本文所提到的设置了docBase属性,那你就咖喱给给了。

 

  此文终结,有说的不对的地方欢迎指正。