4月份开始996加班直到8月中旬结束,然后就是忙碌的辞职、开始找工作,现在终于算是进入一种理性的状态了。记录一下工作中的一点坑。
初来公司,需要写一个自己部门的查询,然后就开始筹备,所有东西都是从0开始搭建,还好第一步只实现能展现即可。果断选择了spring boot。 因为之前公司也有类似的需求,是一个架构搭建了一套,我才第一次认识到了spring boot。然后自己私下学了简单应用,后来忙于工作和看书,这块就扔掉了。现在算是一个全新的机会学习吧。
第一个问题:用httpClient请求远程数据接口遇到登录问题,第一次用httpClient,这下直接蒙圈了,这怎么解决?之前开发的远程数据请求都是无权限验证,然后就开始百度,大概了解了机制后,开始解决这个问题。
第一步:去到登录页,拿到登录请求的链接的参数,这一步具体怎么操作,稍微说一下,用chrom浏览器(就是为了页面请求查看和调试方便)的调试台,然后查看了请求链接,和请求参数.
第二步:根据请求信息自己构造了PostMethod方法请求,这样就实现了远程登录。然后我们内部的系统是这样的,登录会携带一个returnUrl在成功后直接重定向到该请求,我的所有数据都是在这个请求里,然后再在同一个httpClient对象实例下去直接请求数据源,这样就拿到了数据。
这里只是在请求数据源前多了一步登录操作。问题还是非常容易解决。
其实这里还有个问题,因为我的请求是并发的,创建多个线程去请求数据,这样就造成了每一次查询都要并发的登录N次,这样的程序设计出来,呵呵!那怎么解决呢?
如果对session和cookie原理理解的同学很容易就会想到,我们可以把第一个请求的数据请求返回的结果中拿到这些值,然后保存起来,之后的每次创建httpClient对象就直接去容器中拿到这些信息携带过去就实现了,这里还有个问题是,我们的session机制的问题,服务端会设置一定时间过期,那么过期后怎么办呢,这里呢我想了几种解决方案。
方案1:请求进来先去判断容器里有没有,没有的话,去请求登录并返回结果中拿到的值去放到容器中,然后再进行数据请求,拿到的结果进行验证,如果返回登录页,则清空容器再进行登录操作保存最新值。
方案2:单独起一个线程去执行登录操作,并定时的拿这个值去验证是否过期,请求线程只负责拿值去请求即可。
方案3:借用生产者消费者的模型,如果请求数据发现请求过期、阻塞,唤醒一个永久存活的线程去执行登录操作,写到容器中,然后执行唤醒操作,自己请求返回正常则再次阻塞。
从复杂度来讲,每个请求都去执行登录操作是最简单的实现方式,其他几种
第二个坑是springboot的静态资源引用问题。
默认情况下html是在templates下,js,img等是在static下。在页面引入的时候写直接路径即可。
我以为是我配置哪里有问题了,搞到最后才明白,页面引入资源的时候,写的路径一定是从static下一层开始的,千万别带static。 这个问题搞了我2小时,还是今天早上我百度时候看了另外一个路径,然后自己尝试了下发现能找到,请求时候没写static,然后切换回原来的路径下发现也OK了。
这里的.. 代表着 请求路径前缀,比如 http://localhost:8080/
如果这里配置了server.context-path=项目名 则..代表着http://localhost:8080/项目名
如果不加.. 则 直接在填写的js路径前加上http://localhost:8080/
比如你引入路径为 src="/a/b/c", 则发现请求路径是http://localhost:8080/a/b/c
问题3:通常jsp页面我们一般用request对象获取项目的path,这样通过path+相对请求就可以构建完整的请求,但是html没有request对象,需要写相对或者绝对路径。在windows下昨晚用
http://127.0.0.1:8080/请求路径 ajax调用 不管怎么调试 都是进入了error。百度了半天也没有人说啥问题,今天早上又折腾了4小时就在最后快要绝望的时候,看到有个帖子说可能是跨域问题,于是我改了localhost 发现 请求就正常了。又做了其他测试,发现和上面的类似。
如果配置为url:'http://127.0.0.1:8090/项目自定义名称/请求路径',则ajax会因为跨域进入error
如果配置为url:'http://localhost:8090/项目自定义名称/请求路径',则ajax请求正常
如果配置为:url:'/请求路径',且未配置server.content-path,请求正常
如果配置为:url:'/请求路径',且配置server.content-path,请求报错
如果配置为:url:'../请求路径',且配置server.content-path,请求正常
这里留有疑问,关于linux和windows下对127.0.0.1的ajax的识别问题。抽时间一定要搞清楚ajax请求判断是否跨域这个问题是否与操作系统有关