一个奇葩的session问题

打开我是买家之后,enterprise域名下面的sessionId一直在变

排查方向:

1 ngix篡改了sessionId   

     -- 重启ngix,问题没有解决

     -- 测试环境单机,在代码里面把sessionId打印出来,观察到sessionId和前端给的JsessionId是一致的,排除了ngix修改sessionId的问题

     -- 排除ngix缓存的问题

    

2 后端的SPRING_SECURITY有问题

      --  对Spring-security的行为缺乏做够深入的了解

      --   最后证明和spring-security无关,是UC对enterprise域的jsnop调用导致enterprise session失效

      

3 进入“我是买家”,刷卖家中心,无session,排查“我是买家”做了什么会破坏enterprise的session,通过浏览器进行交互,只能是jsnop调用

   -- 发现user jsnop拉取enterprise的数据的时候,会出现已有的session找不到的,导致jsnop重新建立了session

   -- 当前页面替换为百度www.baidu.com,或者旧的 UC,都没问题,可以确认是我是买家这个页面和enterprise域的交互搞出了问题

   -- 观察SessionId有变化,spring-security对于jsnop没有特殊的处理,jsnop就是一个script类型的的get请求   

   -- OC也是jsnop,但是OC就没有问题,刷新USER就不行,因为USER会触发session的销毁

   

===========================

综上所述:根本原因是session销毁   

关键词 Set-cookie

       enterprise

排查方向:

SESSION 监听

HYIPCASEntryPoint监听

前端请求加入trace能力

----------------------------------

C9E11CE580D10AFFEA2023E9D4CD3B34

刷了USER,立马导致enterprise的session被删掉

root@host102:[/var/log/enterprise]tail -10000f  enterprise_app.log  |grep 'session,id'|grep 'C9E11CE580D10AFFEA2023E9D4CD3B34'

2016-06-07 14:08:14 [http-nio-27000-exec-53] [INFO ] [com.enterprise.util.TraceUtils.?:?] |###traceInfo >> FROM EnterpriseSessionListener ,create session,id=C9E11CE580D10AFFEA2023E9D4CD3B34.jvm3_dispatch_102

2016-06-07 14:11:16 [http-nio-27000-exec-72] [INFO ] [com.enterprise.util.TraceUtils.?:?] |###traceInfo >> FROM EnterpriseSessionListener ,destroied session,id=C9E11CE580D10AFFEA2023E9D4CD3B34.jvm3_dispatch_102

===============================================

根本原因定位:

User有一个对enterprise的jsonp调用,做完了会让session失效.

http://enterprise.qbao.com/api/merchant/shop/getRecommendShops.html?jsonpCallback=success_jsonpCallback&userId=100002&pageSize=30&_=1465285635665

2016/6/7 15:54:22

天天向上 2016/6/7 15:54:22

<filter>

<filter-name>InvalideAPISessionFilter</filter-name>

<filter-class>com.enterprise.web.filter.InvalideAPISessionFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>InvalideAPISessionFilter</filter-name>

<url-pattern>/api/*</url-pattern>

</filter-mapping>

public class InvalideAPISessionFilter implements Filter{

@Override

public void destroy() {

}

@Override

public void init(FilterConfig arg0) throws ServletException {

}

@Override

public void doFilter(ServletRequest requset, ServletResponse response,

FilterChain chain) throws IOException, ServletException {

chain.doFilter(requset, response);

if(requset instanceof HttpServletRequest){

HttpServletRequest req = (HttpServletRequest) requset;

req.getSession().invalidate();

}

}

}

enterprise的API接口是会让session自动失效的,防止因为session管理,造成的内存泄露,

新员工维护代码的时候,不小心将接口改成了jsonp导致User的界面把enterprise搞出了问题

猜你喜欢

转载自curious.iteye.com/blog/2304399