谈谈我的session跨域处理方法
情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(www.xyz.com)去访问,即网站需要用两个不同的域名去访问,如首页(www.abc.com)和测试模块(www.xyz.com)
这时候就涉及到session跨域问题,因为域名不是父子关系,所以必须要实现完全跨域,想到了以下三个解决办法:
1.URL传参:测试模块访问的时候,地址www.xyz.com后把主域名的session通过参数的形式传递过去,如:www.xyz.com;jsessionid=7D4DED1F2DB5BC53961EFED18BCE7E30
2.SSO单点登录
3.利用jsonp的跨域特性,通过ajax进行session传递
第一种方案考虑URL传参数不美观以及URL需要分享给别人的时候就没法获取到session,所以放弃
第二种SSO单点登录方案应该在三种方案中最优的,因为系统架构问题,所以也放弃
目前采用的是第三种方案:
1.把网站主域名的头部和测试模块的头部分开,在测试模块的头部加入以下js代码:
(使用测试模块域名www.xyz.com进行网站访问的时候,利用jsonp跨域特性去主域名www.abc.com获取session信息,然后把session信息设置到测试模块域名中)
var user = '${sessionScope.username}';//获取session信息
//先跨域去取主域名登录的session信息
$.getJSON("www.abc.com/user/getname?callback=?",function(data){
if(data != null && data != ""){
//把取到的session数据设置到当前域名的session信息中
$.getJSON("www.xyz.com/user/setname?data="+data+"&callback=?",function(data){
if((user == null || user == "") && data != null && data != ""){
window.location.reload();//需要重新加载一下当前页面,不然头部不会显示session信息
}
});
}else{
//退出登录时清除session信息
if(user != null && user != ""){
$.getJSON("www.xyz.com/user/setname?data=&callback=?",function(data){
if(data != null && data != "" && data == 'ok'){
window.location.reload();
}
});
}
}
});
2.后台实现代码:
@RequestMapping(value="getname")
@ResponseBody
public String getName(HttpServletRequest request,HttpServletResponse response){
//获取回调函数名
String callback = request.getParameter("callback");
String callRes = "";
try {
String username = (String) request.getSession().getAttribute("username");
if(StringUtils.isBlank(username)){
return callback + "()";
}
callRes = callback + "(" + JsonUtils.toJsonString(username) + ")";
} catch (Exception e) {
callRes = callback + "()";
logger.error(e);
}
return callRes;
}
@RequestMapping(value="setname")
@ResponseBody
public String setName(HttpServletRequest request,HttpServletResponse response){
String callRes = "";
//获取回调函数名
String callback = request.getParameter("callback");
String data = request.getParameter("data");
if(StringUtils.isBlank(data)){
request.getSession().invalidate();
return callback + "("+JsonUtils.toJsonString("ok")+")";
}
try {
request.getSession().setAttribute("username", data);
callRes = callback + "("+JsonUtils.toJsonString("ok")+")";
} catch (Exception e) {
callRes = callback + "()";
request.getSession().invalidate();
logger.error(e);
}
return callRes;
}
获取session数据时是否进行数据加密,这个根据自己的需要,最好是把数据加密
session已经实现了共享,这种方案的缺点就是访问测试模块的时候,需要和服务器交互很多次,性能上肯定不好
谁有更好的解决方案,请 不吝赐教,在此感谢!
谈谈我的session跨域处理方法的更多相关文章
- php SESSION跨域问题
这段时间随着项目功能的扩展,慢慢接触到了跨域方面的知识,遇到的更多的问题也是前端与后端交互的时候跨域问题.关于js跨域的问题我会在其他分类里面写.这里记录我今天遇到的php session跨域问题 当 ...
- session跨域共享解决方案
要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域? 一.传递session_id有4 ...
- thinkphp中session跨域问题
问题描述 <thinkphp实现短信验证注册>中,小编不止记录了短信验证码的实现方法,同时还记录了图片验证码的实现方法. 本地使用,一切正常:后端项目和前端项目都部署到服务器,一切正常:后 ...
- 【分布式系列】session跨域及单点登录解决方案
Cookie机制 Cookie技术是客户端的解决方案,Cookie就是由服务器发给客户端的特殊信息,而这些信息以文本文件的方式存放在客户端,然后客户端每次向服务器发送请求的时候都会带上这些特殊的信息. ...
- AJAX四种跨域处理方法
同源策略 同源策略 同源策略限制从一个源加载的文档或者脚本如何与来自另一个源的资源进行交互.这是一个用于隔离潜在恶意文件的关键的安全机制. 具体定义是:一段脚本向后台请求数据,只能读取属于同一协议名. ...
- 170222、使用Spring Session和Redis解决分布式Session跨域共享问题
使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...
- sso单点登录的入门(Session跨域、Spring-Session共享)
1.单点登录,就是多系统,单一位置登录,实现多系统同时登录的一种技术.单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有效的. 区分与三方登录(第三方登录) ,三方登录:某系统,使用其他系统 ...
- java:sso(单点登录(single sign on),jsp文件动静态导入方式,session跨域)
1.jsp文件导入: 2.session跨域: 3.sso(单点登录(single sign on): sso Maven Webapp: LoginController.java: package ...
- [转]vue跨域解决方法
vue跨域解决方法 vue项目中,前端与后台进行数据请求或者提交的时候,如果后台没有设置跨域,前端本地调试代码的时候就会报“No 'Access-Control-Allow-Origin' hea ...
随机推荐
- 彻底取消Myeclipse对js文件的校验
这个是我在网上看到的,自己也做一下笔记. 一般情况下,关掉校验:Window -->Preferences -->MyEclipse -->单击Validation,这样不一定有效. ...
- Python之路-字符编码&数据类型补充
作业 三级菜单程序 menu = { '北京':{ '海淀':{ '五道口':{ 'soho':{ }, '网易':{ }, 'google':{ } }, '中关村':{ '爱奇艺':{}, '汽车 ...
- MySQL(Navicat)运行.sql文件时报错[Err] 2006 - MySQL server has gone away 的解决方法
在my.ini里加上 max_allowed_packet=16M
- 老李推荐:第5章7节《MonkeyRunner源码剖析》Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles
老李推荐:第5章7节<MonkeyRunner源码剖析>Monkey原理分析-启动运行: 循环获取并执行事件 - runMonkeyCycles poptest是国内唯一一家培养测试开 ...
- 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 4
第七步:保存新增加日记 代码3-2-7 增加日记-保存日记 #Step7: Save the note by touch on the "save" menu entry by c ...
- wireshark filter manualpage
NAME wireshark-filter - Wireshark filter syntax and reference SYNOPSIS wireshark [other options] [ - ...
- EM最大期望算法-走读
打算抽时间走读一些算法,尽量通俗的记录下面,希望帮助需要的同学. overview: 基本思想: 通过初始化参数P1,P2,推断出隐变量Z的概率分布(E步): 通过隐变量Z的概 ...
- POJ 2585 Window Pains 题解
链接:http://poj.org/problem?id=2585 题意: 某个人有一个屏幕大小为4*4的电脑,他很喜欢打开窗口,他肯定打开9个窗口,每个窗口大小2*2.并且每个窗口肯定在固定的位置上 ...
- Html 经典布局(三)
经典布局案例(三): <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...
- phpcms课堂笔记
获取父分类下面的子分类 {loop subcat(77) $k $v}{php $subcatid[] = $k;}{/loop}<?php $subcatid = implode(',', $ ...