打开我是买家之后,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搞出了问题