解决session跨域共享问题

1.  session sticky  :会话保存在单机上  保证会话请求落在同一台服务器上

2. session replication:session 复制  每一台服务器上都保持一份相同的session (造成额外的存储开销和网络开销)

3. session 集中存储  :存储在db、 存储在缓存服务器 (redis)

4. 基于cookie (主流)

4.1>>>>
access_token(userid/token/timestamp(过期时间)   加密)  将access_token存储在客户端的cookie中 每次 客户端过来访问
服务器端拦截其中 获取cookie中的access_token 根据 userid和timestamp(过期时间) 判断是否有效

4.2>>>>基于JWT的解决方案 《json web Token》
json web Token  客户端和服务端信息安全传递,身份认证的一种解决方案。用在登陆上

jwt由三个组成:header,payload 载荷,signature

·header{
typ:"jwt" //类型
alg:"HS256" //加密算法
}
·payload  :jwt本身规范提供的格式 claims

iss:“签发者”
iat:“签发时间”
exp:“过期时间”
sub:

可以自己定一些claims,放入自定义的信息如 uid 等
·signature: 将 header+ payload 组合成为一个字符串
Base64(header).Base64(payload) + head中定义的算法 +密钥 生成一个字符串 str.签名字符串 就是 JWT的token

导入依赖:
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.9.9</version>

<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.3.0</version>

JWTutil代码:

  

public class JWTTokenUtil {
    private static final String JWT_KEY_USER_ID="JWT_KEY_USER_ID";
    private static final int EXPIRED_TIME=6000;
    private static final String SECRET_KEY="tengvincent_user";

    public static String generatorToken(Long userId)throws Exception{
        //header Map
        Map<String,Object> headerMap=new HashMap<>();
        headerMap.put("typ","JWT");
        headerMap.put("alg","HS256");

        String token=JWT.create()
                .withHeader(headerMap)
                .withClaim("iss","Service")//签发者
                .withClaim("aud","APP")
                .withClaim(JWT_KEY_USER_ID,userId)
                .withIssuedAt(DateTime.now().toDate())//sign time
                .withExpiresAt(DateTime.now().plusMinutes(EXPIRED_TIME).toDate())//expired time
                .sign(Algorithm.HMAC256(SECRET_KEY));

        return token;
    }

    public static Map<String,Claim> varifyToken(String token){
        DecodedJWT jwt=null;
        try{
            JWTVerifier verifer= JWT.require(Algorithm.HMAC256(SECRET_KEY)).build();
            jwt=verifer.verify(token);
        }catch (Exception e){
            // e.printStackTrace();
            // token 校验失败, 抛出Token验证非法异常
        }
        return jwt.getClaims();
    }

    public static Long getTokenInfo(String token){
        Map<String, Claim> claims = varifyToken(token);
        Claim user_id_claim = claims.get("user_id");
        if (null == user_id_claim || StringUtils.isEmpty(user_id_claim.asString())) {
            // token 校验失败, 抛出Token验证非法异常
        }
        return Long.valueOf(user_id_claim.asString());
    }
}

  

原文地址:https://www.cnblogs.com/zxlsblog/p/11296192.html

时间: 2024-11-25 07:42:17

解决session跨域共享问题的相关文章

使用Spring Session和Redis解决分布式Session跨域共享问题

前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 文末分享了我一部分私人收藏 有兴趣的可以收藏看一下的 都是架构师进阶的内容 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提供的Session共享功能,将Sessi

Redis实战和核心原理详解(5)使用Spring Session和Redis解决分布式Session跨域共享问题

Redis实战和核心原理详解(6)使用Spring Session和Redis解决分布式Session跨域共享问题 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载均衡算法,由于Nginx对不同的请求分发到某一个Tomcat,Tomcat在运行的时候分别是不同的容器里,因此会出现session不同步或者丢失的问题. 实际上实现Session共享的方案很多,其中一种常用的就是使用Tomcat.Jetty等服务器提

session跨域共享解决方案

要让session跨域共享,需要解决三个问题: 1.通过什么方法来传递session_id? 2.通过什么方法来保存session信息? 3.通过什么方法来进行跨域 一.传递session_id有4种方法 1. 通过cookie 2. 设置php.ini中的session.use_trans_sid=1,让PHP自动跨页传递session id 3. 手动通过url或隐藏表单传值 4. 用文件或数据库方式传递,在通过其他key对应取值 二.保存session信息有3种方法 1.数据库 2.mem

session跨域共享

www.maxomnis.com的index.php文件内容 <?phpsession_start();setcookie("user", "alex proter", time()+3600,'/home','maxomnis.com');setcookie("age", "1000000000", time()+3600,'/','maxomnis.com'); $session_id = session_id();

通过jsonp解决浏览器的跨域共享

因为浏览器的同源策略,普通ajax访问跨域请求返回的json数据是不会被浏览器接受的.看下面例子可以看出是访问不到的 首先 定义webapi 后台代码 public class JsopController : ApiController { public IHttpActionResult GetAlluser() { User[] contacts = new User[] { new User{ Name="123", PhoneNo="111", Email

在ExpressJS中设置二级域名跨域共享Cookie

问题:我使用expressjs和mongostore来管理session.下面是expressjs中的设置. app.configure(function(){ app.use(express.session({ secret: conf.secret, maxAge: new Date(Date.now() + 3600000), cookie: { path: ‘/‘ }, store: new MongoStore(conf.db) })); }); 我已经在上面设置了cookie路径.但

聊一聊实现Session跨域的问题

本文来自有着丰富经验的大神和一个小白的对话! 为了阅读方便,小白代号Q, 大神代号W Q: 怎么实现session跨域? W: 别用系统session即可 Q: 那用什么session ?自己存session? W: 自己有啥不行吗 系统的方案是改配置,允许一些域. 不过没用直接自己处理会话来的干脆实际 会话信息就是你说的session 默认系统是跟域名绑定的.但是跨域的本质是后端多系统共享,所以在后端处理数据存取最为直接 路人甲: 现在不是流行 token吗 ? 这不就是一个另类的sessio

java:sso(单点登录(single sign on),jsp文件动静态导入方式,session跨域)

1.jsp文件导入: 2.session跨域: 3.sso(单点登录(single sign on): sso Maven Webapp: LoginController.java: package com.sso.demo.controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans

解决Ajax跨域问题:Origin xx is not allowed by Access-Control-Allow-Origin.

解决Ajax跨域问题:Origin xx is not allowed by Access-Control-Allow-Origin. 今天一个Ajax跨域问题,纠结我半天,记录之. <html> <head> <title>title</title> <script src="http://code.jquery.com/jquery-1.7.1.min.js"></script> <script>