java内部重定向死循环检测详解【附源码】

      最近听到一个消息,据说腾讯的财付通在招聘 Java 方面的高手,"参与系统架构选型",要把底层架构从 C/C++ 迁移到 Java 架构上来。其实当你的项目到一定规模之后更多需要考虑的是多人协作开发的问题,可能当初财付通的核心代码也就是一两个人用C/C++搞定的,可是当业务扩大、复杂之后,发现多人C/C++来并行发开变的不是那么靠谱。于是乎java这种近乎工业标准的东西出来了。。。有点扯远了。引出我们今天的话题,java多人并行开发是很出色,但是只要是并行的那么就会存在一些问题。

      比如:A程序员在A页面写了以个逻辑,当逻辑判断满足就内部重定向到B程序员写的B页面,但是刚好B程序员在B页面中的逻辑是满足某些条件就跳转到A页面,于是乎当某些特定条件下,两个页面就在不停的重定向一直到jvm的溢出。

      平时我们遇到这种问题可能找一会就找到了,也基本上没有什么影响。但是在一个成熟的业务系统中遇到这样的问题就是致命的。可能会导致服务器挂掉。。或者整个集群的连锁反应(集体挂掉)。当然你的用户也就访问不到你的站点了,在工业标准中我们考虑更多的就是怎么让系统更稳定。比如:淘宝一天都宕机了,该有多少商家要发疯。

      再次进入正题,如何来解决这种问题保证系统的绝对稳定呢?很简单一个fielter就搞定了

 

上面这个fielter会检测请求的原始来源地址,然后判断与当前需要跳转的地址是否一致,如果一致那么肯定会形成以个环路,于是jvm就在不停执行跳转一直到堆栈溢出。

对fielter进行了改进,用一个list来记录了forward的跳转路径,方便在页面显示出形成环路的过程

 

 

当我们检测到这种环路,我们就可以抛出异常,定义统一的错误页面。。。。等等来友好的解决之。。。

 

如下fielter的配置就可以看到,我们过滤了所有forward跳转的请求

 

如果有其他需求,类似的配置就OK了

 

万恶的csdn不能传图片啊。。。。

只好上文字了,如果出现环,就会在页面显示,可以下个例子自己看效果

has circle,the cytle is : [/fielter/index.htm, /fielter/test2.htm, /fielter/test.htm, /fielter/test2.htm]

 

接下来附带一个maven搭的测试列子,直接mvn jetty:run,然后再浏览器中http://localhost:8080/fielter/index.htm  就可以看到拦截的效果了

 

源码:点此下载

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 27
    评论
nginx 301定向循环是指在使用nginx进行301永久定向时,由于配置错误或者逻辑问题导致请求在定向过程中陷入无限循环的情况。 通常情况下,nginx的301定向是通过配置server块中的location指令来实现的。当客户端发送请求时,nginx会根据配置的location规则进行匹配,并将匹配到的请求定向到指定的URL。 如果配置的定向规则存在问题,比如将请求定向到了自身或者循环定向到其他URL,就会导致循环的情况发生。例如,以下是一个可能导致循环的nginx配置示例: ``` server { listen 80; server_name example.com; return 301 http://example.com; } ``` 在这个示例中,无论客户端请求任何URL,nginx都会将其定向到http://example.com。这样就会导致请求不断地被定向,从而形成循环。 为了避免nginx 301定向循环,需要确保定向规则正确配置。可以通过以下几种方式来解决问题: 1. 检查定向规则:仔细检查nginx配置文件中的定向规则,确保没有将请求定向到自身或者形成循环定向的情况。 2. 使用301定向的目标URL:在配置定向规则时,确保将请求定向到一个有效的URL,而不是一个无效的URL或者自身。 3. 使用302临时定向:如果无法确定正确的定向规则,可以暂时使用302临时定向代替301永久定向,以避免循环的问题。
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值