应项目要求app端接口用Token,后台接口用Session造成的一系列跨域问题解决

1.web端开启cookie跨域分享后,SessionID每次请求都是变化的

解决方案:

Access-Control-Allow-Origin 跨域参数不能设置成通配符* 得根据实际取具体的内容

2.app端需要自定义header的token字段需要在

Access-Control-Allow-Headers 最后面补齐自己定义的token参数 如我的accessToken

此处给出我的代码

package com.thirtydays.common.interceptor;

import java.io.IOException;

import java.util.Arrays;

import java.util.Enumeration;

import java.util.List;

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import lombok.extern.slf4j.Slf4j;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.stereotype.Component;

/**

* Cross-Origin Resource Sharing跨源资源共享 过滤器 允许前台页面通过ajax或者angualr直接访问

*

*/

@Component

@Slf4j

public class CorsFilter implements Filter {

private static final Logger LOGGER = LoggerFactory.getLogger(CorsFilter.class);

public static final String HOST_SPLIT_LINE = ",";

public static final String ALLOW_HEADER_SPLIT_LINE = "\\|";

@Value("${page.home}")

private String pageHome;

@Override

public void init(FilterConfig filterConfig)

throws ServletException {

}

@Override

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)

throws IOException, ServletException {

HttpServletResponse response = (HttpServletResponse)res;

HttpServletRequest request = (HttpServletRequest)req;

List domains = Arrays.asList(pageHome.split(HOST_SPLIT_LINE));

// 获取发起当前请求的域名

String originHead = request.getHeader("Origin");

int index = index(domains, originHead);

if (index >= 0) {

String matchHeader = domains.get(index);

if (matchHeader.split(ALLOW_HEADER_SPLIT_LINE).length > 1) {

String [] headerConfig = matchHeader.split(ALLOW_HEADER_SPLIT_LINE);

// 允许的访问域,允许全部则为*,允许部分则配置详细的http地址,端口后不能有/

response.setHeader("Access-Control-Allow-Origin", headerConfig[1]);

} else {

response.setHeader("Access-Control-Allow-Origin", originHead);

}

} else {

response.setHeader("Access-Control-Allow-Origin", domains.get(0));

}

// 允许的访问域,允许全部则为*,允许部分则配置详细的http地址,端口后不能有/

// response.setHeader("Access-Control-Allow-Origin", "*");

// 访问授权有效期 为一周,单位为秒

response.setHeader("Access-Control-Max-Age", "604800");

// 默认只允许GET、POST请求,需要将PUT和DELETE也加入此列

response.setHeader("Access-Control-Allow-Methods", "OPTIONS,GET,POST,PUT,DELETE");

// 允许自定义 header accessToken

response.setHeader("Access-Control-Allow-Headers",

"Authorization,Origin, Accept, Content-Type, X-HTTP-Method, X-HTTP-METHOD-OVERRIDE,XRequestedWith,X-Requested-With,xhr,custom-enterpriseId,x-clientappversion, x-wxopenid, x-devicetype,accessToken");

response.setHeader("Access-Control-Allow-Credentials", "true");

chain.doFilter(req, res);

}

@Override

public void destroy() {

}

/**

* 计算Header所在索引位置

* @param domains 域名列表

* @param curDomain 当前页面域名

* @return

* @return int 返回类型

* @date 2020年6月30日 上午11:53:31

*/

private int index(List domains, String curDomain) {

String domain = null;

for (int i = 0; i < domains.size(); i++) {

domain = domains.get(i);

String strs [] = domain.split(ALLOW_HEADER_SPLIT_LINE);

if ((null != strs) && (strs[0].equals(curDomain))) {

return i;

}

if (domain.equals(curDomain)) {

return i;

}

}

return -1;

}

}

html访问时sessionid变,传统Session跨域导致的Sessionid不一致问题解决方案相关推荐

  1. Session跨域及单点登录解决方案

    cookie机制 关于cookie和seesion的联系 cookie中会包含那些信息 名字,值,过期时间,路径,域 cookie会带到http请求头中发送给服务端 如果cookie没有设置过期时间的 ...

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

    使用Spring Session和Redis解决分布式Session跨域共享问题 原创 2017-02-27 徐刘根 Java后端技术 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用 ...

  3. 谈谈我的session跨域处理方法

    情景:公司的一个网站有一个模块(测试模块)需要单独用另外的一个域名(www.xyz.com)去访问,即网站需要用两个不同的域名去访问,如首页(www.abc.com)和测试模块(www.xyz.com ...

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

    大家可以关注一下公众号"Java架构师秘籍" 前言 对于分布式使用Nginx+Tomcat实现负载均衡,最常用的均衡算法有IP_Hash.轮训.根据权重.随机等.不管对于哪一种负载 ...

  5. Spring Boot 2.X + Shiro 优雅解决 session 跨域问题

    一.跨域问题 web 开发中跨域问题是一个老生常谈的问题,根本原因是浏览器基于安全原因考虑对非同源的脚本操作和 ajax 访问进行了限制,介绍的文章网上有很多,这里不做赘述. 二.解决方案 跨域问题有 ...

  6. think php框架 跨域,ThinkPHP框架实现session跨域问题

    这篇文章主要介绍了ThinkPHP框架实现session跨域问题的解决方法,需要的朋友可以参考下 ThinkPHP的session跨域问题很多开发者都遇到过! 其实不管是ThinkPHP还是php本身 ...

  7. php跨域session共享,PHP中利用COOKIE与SESSION联合实现SESSION跨域

    大家都知道 在一般情况下,一个网站只有一个域名,www.demo.com,但是也有些网站架构是由多个子域名组建的.所以就需要SESSION可以跨子域被 访问到,这样才可以实现用户的跨域登录.就是说客户 ...

  8. session跨域共享解决方案

    session跨域共享解决方案 参考文章: (1)session跨域共享解决方案 (2)https://www.cnblogs.com/sustudy/p/5332584.html 备忘一下.

  9. nginx处理cros跨域遇到的各种问题及解决方案,以及https配置和浏览器https不安全问题处理

    文章目录 前言 前言一.什么是跨域? 前言二.跨域产生的条件? 跨域处理常用的两种办法 一.springboot如何处理跨域问题? 1.1 controller中单独配置 1.2 在@configat ...

最新文章

  1. 【Paper】2010_Distributed optimal control of multiple systems
  2. J.U.C 提供的阻塞队列
  3. 第十一周项目3-程序的多文件组织
  4. 漫步线性代数十二——网络
  5. 修正TiAnlogDisplay显示的问题
  6. oracle将存储过程导出,Oracle如何导出存储过程
  7. 比较好的浏览器_一款安卓黑科技手机浏览器 体积很小,功能很6!
  8. 《Ray Tracing from the Ground Up》中的坐标系是怎么确定的
  9. with grant option 与with admin option的区别
  10. [Python设计模式] 第14章 老板来了——观察者模式
  11. 01-SA8155P Flat Build QFIL刷机
  12. Python 从视频中分离音频
  13. SSCI写作--期刊检索和基本介绍
  14. Flutter 图片透明度(光暗程度)
  15. 电力电子技术课程设计matlab,电力电子技术课程设计-基于matlab的单相交流调压电路的设计与仿真.doc...
  16. 基于光流和RNN的长视频微表情检测
  17. 【Linux学习】常见基本指令
  18. 这恐怕是学习Frida最详细的笔记了
  19. 提取字符串中一个或多个空格隔开的字符串
  20. 【星辰傀儡线·命运环·卷二 尘埃】 4 蓝月

热门文章

  1. Python 打印嵌套list中每个数据(遍历列表)
  2. 限制文本框中只能输入数字(+,-)的正则表达式写法
  3. 中日文字编码转换_关于编码你必须知道的知识和技巧
  4. 微课|中学生可以这样学Python(例4.6):抓小狐狸游戏
  5. Python实现局域网内屏幕广播的技术要点分析
  6. Python使用UDP协议打造在线时间服务器
  7. C++ 什么是伪函数,以及伪函数的使用
  8. Consecutive Factors (20)
  9. mysql表空间增长过快_Oracle表空间增长异常解决又一例
  10. javafx-TableView 行颜色设置