第三方支付过程中session失效问题

第三方支付过程中session失效问题

时间 2015-05-13 12:36:23  IT社区推荐资讯

原文  http://itindex.net/detail/53436-session-问题

主题 Java

问题产行于公司p2c交易平台的一个用户充值模块。

平台简介:该平台通过第三方支付(以下使用“支付宝”代替)完成与各大银行的交易(充值、投资、转帐、提现等操作),并将数据保存在我司的服务器数据库中,服务器使用tomcat,数据库Mysql

平台充值流程:用户登陆系统----点击充值-----跳转到支付宝----登陆支付宝------选择银行------充值完毕-----redrect到用户中心(平台中的action为"preurl:/user/center"),问题来了,

当用户充值完成后转回用户中心时平台转回了登陆界面,需要用户重新输入一次用户名和密码才能到达用户中心。

谈到此种现象,但凡搞过java开发的软件工程师应该都能想到是session问题,好吧,让我们来一起研究一下从点击充值到支付完成过程中session的变化。

1、用户使用username 和 password登陆后会将用户信息保存在session中,并且在客户端浏览器的cookie中添加一个cookie(key:JSESSIONID,value:XXX);

2、用户点击充值按钮跳转到支付宝---XX银行进行充值,由于XX银行充值网站也是使用tomcat,那么cookie中默认的session key 也为 JSESSIONID,这样以来充值完毕便修改了cookie中session的值;

3、平台使用spring security的用户登陆校验,拦截所有需要用户登陆的界面,这样以来,当充值完成返回preurl:/user/center的时候被spring拦截,并取出cookie中JSESSIONID所对应的值再去session里查找用户信息;

4、由于XX银行修改过的session与原session并非同一session,于是spring将其拦截到用户登陆界面;

以上便是一个很常见的跨域访问session失效问题,但是问题并非想象中那么简单,至少笔者在此问题上费了很大的力气,并寻问“众大神”以及几千人的技术群,无一人知晓(或许真正的大神不屑一顾吧),现解决办法及说明总结如下:

1、总体思路

在用户点击充值时将sessionid保存下来,充值成功后再将sessionid取出来替换

2、具体实现

支付宝接口说明中有一个字段叫做merpri(私有域),官方解释:“用户自定义字段,可以将自己需要

的信息保存在里面,接口调用完成后原样返回”,那么正好是我们需要的,在向支付宝write数据时,我将sessionid取到并放入merpri中,然后在回调时将merpri中的值取出,通过遍历cookie数组将数组中名为JSESSIONID的cookie替换为之前的,关键代码如下:

//说明:以下代码为直接在博客中手写如有错误请留言,以便及时更正
//从jsf中获取
HttpServletRequest request = FacesUtil.getHttpServletRequest ();
HttpServletResponse response = FacesUtil.getHttpServletResponse();
//从支付宝返回参数中获取之前保存的sessionid
String finalSession = request.getParameter("merpri");
Cookie[] cookies = request.getCookies();
for(Cookie c : cookies){
     if(c.getName.equals("JSESSIONID")){
         //如果是带域名的网站需要配置,因为现在的问题是跨域session失效
         c.setDomain(".alibaba.com");
          //删除cookie
         c.setMaxAge(0);
         //设置路径(域名后面的主路径)
         c.setPath("/alibaba");
         response.addCookie(c);
         c.setDomain(".alibaba.com");
         Cookie cookie = new Cookie("JSESSIONID",finalSession);
         //设置生命周期为20分
         cookie .setMaxAge(20);
         cookie .setPath("/");
         response.addCookie(cookie);
     }
}

3、容易出问题的地方总结:

1)  不要将代码放在耦合性较强的代码逻辑中

2) cookie中sessionid的操作一定要在返回/user/center 之前最近位置(否则将无法删除cookie)

3) cookie生命周期和路径一定要注意匹配,应当使用调试工具查看cookie实时的一个值

4) 设置domain时需要特别注意,经本人测试以下四种浏览器:ie 9, firefox, 360安全, 猎豹

其中ie 9 和 firefox域为 .alibaba.com  而360安全,猎豹 的域为www.alibaba.com这样就会出现:使用不同的浏览器设置cookie的域不同而导致其中2个浏览器依然无法正常跳转到用户中心,解决办法:在代码中判断其内核,根据不同的内核设定不同的域。

5) 若使用的第三方支付没有私有域的概念,那么请使用数据库代替吧,即:将sessionid放入数据库中,这样以来要保证事务的完整性了

题外话:

(谈到浏览器的兼容问题,IE浏览器不得不让人大跌眼镜,众所知周,所谓“浏览器兼容”无非就是IE这个“笨重的家伙”,解析js速度慢到极点,并且效果看上去极差,这一点应该向谷歌和火狐学习),360有个新功能是这样描述的:

我们新增加了一个控制手段:内核控制Meta标签。只要你在自己的网站里增加一个Meta标签,告诉360浏览器这个网址应该用哪个内核渲染,哪么360浏览器就会在读取到这个标签后,立即切换对应的内核。并将这个行为应用于这个二级域名下所有网址。

目前该功能已经在所有的360安全浏览器实现。我们也建议其它浏览器厂商一起支持这个实现。让这个控制标签成为行业标准。

在head标签中添加一行代码:

<html>
  <head>
    <meta name="renderer" content="webkit|ie-comp|ie-stand">
  </head>
  <body>
  </body>
</html>

浏览器的兼容问题严重困扰了众多的软件工程师,不仅仅是前端开发,在此希望能够出台一个浏览器标准将所有的浏览器内核规范处理,开发工程师使用这个规范去开发,以减少这种“由于浏览器间客户流量竞争”而给开发者带来的工作量。

时间: 2024-12-15 12:02:54

第三方支付过程中session失效问题的相关文章

关于第三方支付后无session问题处理

具体情况是点击支付并且成功后,跳转回商城页的时候由于跨域问题而没有了session,这不科学啊!如果说每次支付之后再登录,那妥妥的一个差评. 做为一个菜鸟碰到这问题,我也是心醉了,找了很多的大神写的方法.但是我没看懂,先汗一个. 之后在查找问题的时候发现session不是被消除了,而是只限于跳回来的页面没有而已. 然后我又试着如何将session带到回调中,然而依然没有找到合适的方法. 后来实在想不出来,先冷静一下然后从头开始读逻辑,发现既然目前的知识没有办法达到我的想法,那么我是不是可以换个方

解决IIS设置多个工作进程中Session失效的问题

利用StateServer实现Session共享 session保存在专门的StateServer中,该种方式,性能损失比sql略好.比inproc据说有10%-15%的性能损失.怎么使用StateServer 服务器呢? 1.初始化StateServer服务器 启动ASP.NET 状态服务[aspnet_state],该服务默认是手动启动的,可以通过修改注册表,设置为自动启动并允许远程连接.修改方法如下: 修改注册表: [HKEY_LOCAL_MACHINE/SYSTEM/ControlSet

第三方支付架构设计之—帐户体系

第三方支付架构设计之-帐户体系 一,      什么是第三方支付? 什么是第三方支付?相信很多人对这个名字很熟悉,不管是从各种媒体等都经常听到,可以说是耳熟能熟.但,如果非得给这个名词总结出一个概念,却发现很难准确和全面的表述清楚.不过关系不大,我们无法给出一个很准确的概念的时候,我们就列举一下实际生活中我们经常使用第三方支付的例子:支付宝,财付通,微信支付等等,这些就是我们国内目前在第三方支付市场中比较有影响力的第三方支付了. 搜索一下百度,所谓第三方支付,就是一些和产品所在国家以及国外各大银

Android常用第三方支付

移动支付 用户使用移动的终端完成对所购买商品或者服务的支付功能;分为近场支付(蓝牙支付,刷卡,滴卡),和远程支付(网上支付,短信支付) app支付模块 常见的支付厂商-->常见的支付方式 支付宝:阿里公司 微信:腾讯公司 银联:联合起来的结构 财付通:腾讯公司 支付宝钱包:阿里公司 百度钱包:百度公司 支付安全吗? 都是比较安全.都是大公司的产品.而且这个和金钱之前挂钩; 支付难不难? 支付不难.因为是第三方平台的东西. 支付集成大概需要多长时间?(如果之前做过) 支付宝:5-10分钟 银联:5

第三方支付平台的安全策略

在清算的情况下,这导致支付平台账户上剩余大量资金,从而形成资金.融资融券软件开发这些资金可以在第三方支付平台上停留3天到一周,有些可以停留几年.如果第三方支付平台恶意挪用资金或者将资金用于风险投资,一旦出现问题将严重影响公众对第三方支付平台的信任.电子商务交易甚至整个社会都将面临巨大的风险,这将引发社会信用危机.目前,只有支付宝将这些资金存入银行的专有账户,其他支付平台的资金面临此类安全风险. 多种技术手段确保用户安全 在第三方在线支付过程中,很难避免技术风险,而支付各方面的技术问题将直接或间接

关于第三方支付,看这篇文章就够了!

万字长文为您介绍第三方支付:起源.发展与趋势 随着移动支付的快速发展,第三方支付已经深度融入到生活中,如果生活在一二线城市,从吃饭.购物.看电影.菜市场买菜到搭公交地铁,你能想到的消费场景,基本都可以用移动支付解决.在这些便捷的背后都有第三方支付在支撑,虽然我们每天都在接触第三方支付,但真的了解第三方支付吗? 准备用一篇长文为大家深度解读第三方支付,因为文章比长,大家可以先根据目录来了解. 目录 [TOC] 1.第三方支付概述 2.第三方支付起源 PayPal 支付宝 3.牌照发放 4.支付牌照

CI框架问题之一(session失效问题)

CI 中session失效问题解决 1.检查配置文件config.php中 $config['cookie_domain']= ".dahong.com" 是否设置正确,而且最后面不要加 "/" 2.检查 memcache服务是否成功开启 如果是放入数据库,检查表中记录是否更新 3. 关于memcache的函数设置断点,检查 是否有进入存储的语句被屏蔽 基于这一点需要使用测试工具: 查看memcache的存储记录

支付宝老大位置不保?第三方支付江湖变数依旧

比达咨询2017年第2季度中国第三方移动支付市场发展报告显示,第2季度的第三方移动支付市场交易规模中,支付宝占51.9%,财付通占34.1%.这就意味着,在目前的第三方移动支付市场中,支付宝和财付通双雄格局已定.但从微信和支付宝大战这一缩影中,我们可以预见第三方支付市场依然存在着许多变数. 零和博弈下,支付老大或易主 最近,微信和支付宝的一系列出海事件颇受关注,他们在支付领域的博弈已经延伸至海外许多国家,可见双方的厮杀程度相当激烈.虽然支付宝作为老大哥在前挥旗呐喊,但微信不敢懈怠,快马加鞭在后追

Android 第三方支付

1.从官方下载demo及sdk 2.将demo导入eclipse 或者studio 3.要实现真正的支付,需要用到APPID.PID.RSA_PRIVATE或者RSA2_PRIVATE PayDemoActivity类页面 package com.alipay.sdk.pay.demo; import java.util.Map; import com.alipay.sdk.app.AuthTask;import com.alipay.sdk.app.PayTask;import com.ali