上篇博客说到,当我执行程序时,springmvc的控制下,它始终跳转到首页,而不正常跳转。当时通过换一个服务器解决了问题,以为是缓存的事儿。但后来又发生了同样的事儿,顿时感觉出事儿了。就立马降低了日志输出等级,一看,果然有问题。虽然目前还没有解决,只是有一些思路,不过,也写下了记录一下!

一、程序的简单概述

页面打开,是加载到一个列表页,然后通过点击列表页的链接按钮,跳转到详情页。在详情页中,有倒计时,倒计时结束后,会出现一个开始抢购商品的按钮,点击按钮,就可以进行抢购提交订单。

这之中涉及到的后台方法有:list(加载被抢购商品的基本信息列表)、detail(商品详情)、exposer(暴露抢购地址)、execute(执行抢购)、time(获取当前时间)

整个模块的简单流程是:(每次都忍不住自己吐槽画图水平,我对word情有独钟,已经很久不画流程图,手都生疏了,各位游客就将就着看吧)

二、出现的问题

之前是在列表页跳转到商品详情页的时候,总是反复的打开主页面,反复的执行controller的同一个方法。现在的情况是,在执行倒计时的过程中,显示一个执行抢购的按钮,然后给这个按钮绑定单击执行抢购事件。但是在这个过程中,需要向后台请求time,还有暴露抢购地址的方法。问题是:当执行time请求的时候,没有问题,但是请求地址暴露方法时,又给跳转到list方法上了,根本不执行exposer方法。这样就直接导致,web页面无法显示开始抢购的按钮,整个后续的流程,也就无法执行完!

三、日志分析(截取关键)

首先看执行相关方法的日志输出:

 [org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[DEBUG] Looking up
handler method for path /1001/exposer
2017-03-05 12:34:13,072 [http-nio-8080-exec-2]
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[DEBUG] Returning
handler method [public java.lang.String Web.SeckillController.list(org.springframework.ui.Model)]

从日志可以看出,当在寻找/1001/exposer的时候,本来应该返回的是SecKillController.exposer()方法,但结果,返回的是list方法。然后我就以为是这个方法选择器出问题了,还有就是这个路径匹配出了问题,就加载源码,设置断点,重点调试RequestMappingHandlerMapping类和HandlerMethodSelector类,就是想看看这个东西是不是真的在代码执行的时候就出问题了,事实证明并不是的。然后再比对日志,更是清晰明了的说明了问题:

017-03-05 12:29:58,214 [http-nio-8080-exec-2]
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[DEBUG] Looking for
request mappings in application context: WebApplicationContext for namespace 'SecKill-servlet': startup
date [Sun Mar 05 12:29:55 CST 2017]; parent: Root WebApplicationContext
2017-03-05 12:32:30,112 [http-nio-8080-exec-2]
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[INFO] Mapped
"{[/time/now],methods=[GET]}" onto public Dto.SeckillResult<java.lang.Long> Web.SeckillController.time()
2017-03-05 12:32:33,108 [http-nio-8080-exec-2]
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[INFO] Mapped
"{[],methods=[GET]}" onto public java.lang.String Web.SeckillController.list(org.springframework.ui.Model)
2017-03-05 12:32:35,216 [http-nio-8080-exec-2]
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[INFO] Mapped
"{[/{seckillId}/{md5}/execution],methods=[POST],produces=[application/json;charset=UTF-8]}" onto public
Dto.SeckillResult<Dto.SeckillExecution>
Web.SeckillController.execute(java.lang.Long,java.lang.String,java.lang.Long)
2017-03-05 12:33:37,191 [http-nio-8080-exec-2]
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[INFO] Mapped
"{[/{seckillId}/detail],methods=[GET]}" onto public java.lang.String
Web.SeckillController.detail(java.lang.Long,org.springframework.ui.Model)
2017-03-05 12:33:48,565 [http-nio-8080-exec-2]
[org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping]-[INFO] Mapped
"{[/{seckillId}/exposer],methods=[POST],produces=[application/json;charset=UTF-8]}" onto public
Dto.SeckillResult<Dto.Exposer> Web.SeckillController.exposer(java.lang.Long)

在日志信息中,很明显可以看出,每个方法都是匹配无误的。那么到底是哪儿出了问题呢?

注意看每次都会跳转至的list方法的匹配特点,是[ ],也即是说,如果路径没有匹配地址,那么就会执行到list方法。什么时候,明明URL上有路径,但是却又被servlet拦截不到呢,反而去执行了list方法呢?

三、问题分析

程序如果没有访问路径,那么本来应该报出404的错误。也就是上一篇博客中的疑惑一:消失的404页面。看了日志之后,并不是404页面消失了,而是当在controller中没有找到匹配路径时,而list方法的匹配路径为[ ],这时候,自然而然的就会执行list,并没有所谓的错误存在,也就并不会有预想中的404页面。

首先,上次的跳转详情页,出现的反复跳转到list首页,根据我今天犯的一个错,突然醒悟,我把那个detail给打错了,导致无法匹配路径,直接执行list方法。

其次,在请求暴露抢购路径时,为了避免用户通过浏览器加上猜测,而获得抢购路径,而在controllser中标记了Post请求,然而,在Js中请求这个方法的时候,却用的是Get,自然而然不会跳到对应的方法,而找不到路径的时候,而list的匹配路径为[ ],很自然的又执行了list方法。

以上,就是问题出现的根本原因,和缓存没有关系。我上次换了一个tomcat服务器,那个并不是解决问题的方法,我现在想想,可能是我刚好换了服务器,我刚好又把那个detail的词给些对了,才造成了我以为是换了服务器,清理了缓存解决问题的错觉!

四、总结

虽然问题解决了,但是问题又来了,为什么list的分发路径变为了[ ],而自从发现这个情况之后,我反复的测试了好几次,刚开始的时候,不管我怎么换路径,始终都是[ ],后来再试了几次,包括改请求方式,还有方法名等,还是[ ],可是过了一会儿,我再重启的时候,路径就变成我所配置的路径。再然后反复撤销代码,才发现了端倪:

 @RequestMapping(name = "/list", method = RequestMethod.GET)

呃,很想打死我自己!

虽然导致问题出现的原因很奇葩,也是由于自己的粗心大意了。但是,解决问题的过程很惊险和刺激,尤其是调试springMVC的源码,还有就是读日志找原因的过程,真的感觉很好。说实在的,我很少去一行一行的分析日志,然后调试框架的源码,呃,如果不敢工期的话,我倒希望我多手贱几回!哈哈哈哈。。。。。。

从明天起,我要拿出我写诗的心情去写代码,立志把代码写成诗一般的感觉。。。。。。。。。

springmvc始终跳转至首页,不报404错误(续)的更多相关文章

  1. springmvc始终跳转至首页,不报404错误

    本篇博客特别补充:2017-3-4 9:42,经过分析和测试,本篇博客的解决方案只是碰巧,暂时的解决了问题.在后续的运行中,又出现了同样的毛病.经过日志跟踪,发现了端倪,下篇博客深入的剖析!本篇博客, ...

  2. SpringMVC中用@ParamVariable传递的参数包含斜杠(/)时,匹配不了报404错误的解决方案

    今天做网站[标签]筛选功能时,出现了这么个奇葩的问题. 我是直接通过<a>标签中href来跳转的,url中包含汉字 <a href="/tags/标签A"> ...

  3. springmvc项目,浏览器报404错误的问题

    问题描述: 建立了web工程,配置pom.xml,web.xml,编写controller类,在spring-mvc-servlet.xml文件中指定开启注解和扫描的包位置<mvc:annota ...

  4. SpringMvc实现批量删除,使用post传值一直报404错误

    Ajax结合SpringMVC实现批量删除信息,在前台使用post向后台传递要删除的id的集合额时候,一直报404错误, 前台post传值的源码如下: 了解一下: (1)第二行的rows为前面得到的一 ...

  5. springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。

    springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...

  6. 对于springmvc 很奇妙的报404错误的记录

    @RequestMapping("/editItems") public ModelAndView editItems(Integer id) throws Exception { ...

  7. <mvc:default-servlet-handler/>导致controller失效,报404错误

    最近在做ssm框架整合的一个小项目时,页面跳转一直有404错误,也没有报错提示.然后一步一步去找,终于发现是<mvc:default-servlet-handler/>的原因.如下图所示, ...

  8. WinServer2008R2 + IIS 7.5 + .NET4.0 经典模式 运行WebAPI程序报404错误的解决方案

    在Windows Server 2008 R2系统下,IIS 7.5 + .NET Framework 4.0的运行环境,以经典模式(Classic Mode)部署一个用.NET 4.0编译的 Web ...

  9. Eclipse配置tomcat后,启动tomcat,访问tomcat报404错误

    当你在Eclipse中新建一个工程,配置好tomcat,然后测试tomcat是否配置成功的时候,报404错误异常. 解决方法: 1,把工程文件删除,重新建立一个新的工程, 2,新建一个工程. 3,Ne ...

随机推荐

  1. MySql自动默认时间及更新时间

    注意:5.7 才能用类型为datetime的字段实现 `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `modifie ...

  2. CentOS7.3+MySQL5.7+Apache2.4+PHP7.1+phpMyAdmin4.7+JDK1.8+SVN1.6+Jenkins2.1环境搭建

    CentOS7.3+MySQL5.7+Apache2.4+PHP7.1+phpMyAdmin4.7+JDK1.8+SVN1.6+Jenkins2.1环境搭建 1.安装CentOS7.3虚拟机安装说明: ...

  3. Android(java)学习笔记122:BroadcastReceiver之 有序广播和无序广播(BroadcastReceiver优先级)

    之前我们在Android(java)学习笔记178中自定义的广播是无序广播,下面我们要了解一下有序广播: 1. 我们首先了解一下有序广播和无序广播区别和联系? (1)有序广播> 接受者有优先级, ...

  4. Spring boot 集成Kafka

    搭建Kafka集群,参考: https://www.cnblogs.com/jonban/p/kafka.html 源码示例如下: 1.新建 Maven 项目 kafka 2.pom.xml < ...

  5. eclipse报错GC overhead limit exceed,卡顿

    在使用Eclipse的Build Project功能时,提示以下错误: An internal error occurred during: “Build Project”. GC overhead ...

  6. C Library - <limits.h>

    Introduction The limits.h header determines various properties of the various variable types. The ma ...

  7. javaweb基础(20)_JavaBean总结

    一.什么是JavaBean JavaBean是一个遵循特定写法的Java类,它通常具有如下特点: 这个Java类必须具有一个无参的构造函数 属性必须私有化. 私有化的属性必须通过public类型的方法 ...

  8. 拓扑排序 topsort

    拓扑排序 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序 ...

  9. centos 7 忘记root 密码

    @@@@首先开启系统,出现下图界面以后,按e键. @@@使用下放下箭头找到图中的位置,在下图中 修改 ro 为 rw , 添加init=sysroot/bin/sh @@@按Ctrl + x 进入单用 ...

  10. 记一次header跨域与cookie共享

       最近把左边的传统模式,换成了右边通过js直接调api拿数据并渲染,于是变出现了ajax的跨域问题:XMLHttpRequest cannot load http://api.abc.com/?s ...