思想: 添加过滤器 设置请求头 代码如下

import java.io.IOException;

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.HttpServletResponse; public class CorsFilter implements Filter { @Override
public void destroy() {
} @Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
        String []  allowDomain= {"http://localhost:8082","http://localhost:8081","http://localhost:8181","http://localhost:8180"};
Set<String> allowedOrigins= new HashSet<String>(Arrays.asList(allowDomain));
String originHeader=((HttpServletRequest) req).getHeader("Origin");
if (allowedOrigins.contains(originHeader)){
((HttpServletResponse) res).setHeader("Access-Control-Allow-Origin", originHeader);
((HttpServletResponse) res).setContentType("application/json;charset=UTF-8");
((HttpServletResponse) res).setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
((HttpServletResponse) res).setHeader("Access-Control-Max-Age", "3600");
//表明服务器支持的所有头信息字段
((HttpServletResponse) res).setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Pragma, Last-Modified, Cache-Control, Expires, Content-Type, X-E4M-With,userId,token");
//如果要把Cookie发到服务器,需要指定Access-Control-Allow-Credentials字段为true;
((HttpServletResponse) res).setHeader("Access-Control-Allow-Credentials", "true");
((HttpServletResponse) res).setHeader("XDomainRequestAllowed","1"); }
chain.doFilter(req, res);

    }

    @Override
public void init(FilterConfig arg0) throws ServletException {
} }

web.xml设置拦截器

<!-- CORS拦截器 -->
<filter>
<filter-name>cors</filter-name>
<filter-class>com.deppon.vas.common.framework.cors.CorsFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>cors</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

解决同源问题之后,接下来就是解决访问的cookie问题

思路 从shiro获取登陆成功的session 然后防止缓存 如jedis 之后将sessionid放入cookie 添加至response 返回页面 ,然后设置ajax跨域,这样同一域名下就可以获取到redis中的session信息

代码如下

  @Override
protected boolean onLoginSuccess(AuthenticationToken token,Subject subject, ServletRequest request, ServletResponse response)throws Exception { HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
// 不是ajax请求
if (!AJAX_HEADER_MATH.equalsIgnoreCase(httpRequest.getHeader(AJAX_HEADER))) {
//执行重定向操作
issueSuccessRedirect(request, response);
} else { /**用于跨域session传递start*/
//获取session
Session session = subject.getSession();
//获取sessionId
String sessionId = session.getId().toString();
Cookie cookied = CookieUtil.getCookie(sessionId, httpRequest);
if (cookied != null) {
// 修改cookie时间戳
cookied.setValue(sessionId);
} else {
// 重新new一个Cookie
cookied = new Cookie(Constance.VAS_SESSIONID, sessionId);
}
//默认值是-1,表示关闭浏览器,cookie就会消失。
// cookied.setMaxAge(-1);
cookied.setPath("/");// 同一个域名所有url cookie共享
cookied.setDomain("");
//30分钟失效
cookied.setMaxAge(NumConstance.EXPIRE_TIME);//不写入磁盘,只写入内存,只有在当前页面有用,浏览器关闭立即失效
httpResponse.addCookie(cookied);
/**用于跨域session传递end*/
httpResponse.setCharacterEncoding("UTF-8");
PrintWriter out = httpResponse.getWriter();
out.println("{success:true,message:'loginSuccess'}");//登录成功
out.flush();
out.close(); }
public class CookieUtil {

    /**
* 获取HttpCookie对象,根据传入的cookie的name值获取, 参数可以通过
* @param name
* @param request
* @return
*/
public static Cookie getCookie(String name,HttpServletRequest request) {
if (StringUtils.isBlank(name)) {
return null;
}
Cookie[] cookies = request.getCookies();
if (cookies != null && cookies.length > 0) {
for (int i=cookies.length-1; i >=0; i--) {
if (name.equals(cookies[i].getName())) {
return cookies[i];
}
}
}
return null;
} }
$.ajax({
type:"POST",
data:formData,
processData:false,
contentType:false,
//设置可跨域
xhrFields: {
withCredentials: true
},
crossDomain: true,
url:
success:function(data,textStatus){
swal("上传成功");
},
exception:function(data,textStatus){ }
});
注意标红部分

这样在当前域的任何端口都能获取到session

完毕

设置请求头解决浏览器同源问题,ajx跨域获取cookie问题的更多相关文章

  1. 浏览器同源策略,跨域请求jsonp

    浏览器的同源策略 浏览器安全的基石是"同源政策"(same-origin policy) 含义: 1995年,同源政策由 Netscape 公司引入浏览器.目前,所有浏览器都实行这 ...

  2. 简单设置,解决使用webpack前后端跨域发送cookie的问题

    最近用vue来做项目,用webpack来做前端自动化构建.webpack-dev-server会在本地搭建一个服务器,在和后端调试的时候,就会涉及到跨域的问题. 刚开始时,没有用vue-cli来构建项 ...

  3. ajax请求头加Token时发生的跨域(CORS)请求问题

    首先描述下问题:需求是在请求头中加入token,我在ajax请求数据时添加了请求头‘Authorization’字段,并添加了响应的token值,在请求数据的时候浏览器报错如下: Request he ...

  4. 关于跨域获取cookie问题的解决

    需求是有2个域名:www.a.com和www.b.com,b.com需要获取a.com中的cookie,解决方法是这样的: 在a.com编写一个设置cookie的页面:set_cookie.php 代 ...

  5. 第二百七十四节,同源策略和跨域Ajax

    同源策略和跨域Ajax 什么是同源策略  尽管浏览器的安全措施多种多样,但是要想黑掉一个Web应用,只要在浏览器的多种安全措施中找到某种措施的一个漏洞或者绕过一种安全措施的方法即可.浏览器的各种保安措 ...

  6. django中同源策略和跨域解决方案

    一  同源策略 1.1何谓同源? 如果两个页面的协议,端口(如果有指定)和域名都相同,则两个页面具有相同的源. 举个例子: 下表给出了相对http://a.xyz.com/dir/page.html同 ...

  7. axios设置请求头失效的问题

    前言:因为在使用vue-element-admin框架时遇到了设置请求头失效的问题,在后来发现是代理跨域问题,所以又简单理解了一下跨域. 出现的问题是我在axios拦截器上设置了请求头token,但是 ...

  8. ajax中的setRequestHeader设置请求头

    1.问题引发点: 前不久发现一个问题: 前端并没有设置请求头信息里面的Accept-Encoding:gzip...但是在请求头中可以明显的看到Accept-Encoding:gzip, deflat ...

  9. 设置请求头信息User-Agent

    设置请求头信息User-Agent来模拟浏览器. 先来看User-Agent: 当我们向服务器发送请求时,浏览器会将一些头信息附加上,然后发给服务器. 如上图所示头信息(请求头信息 Request H ...

随机推荐

  1. D. Closest Equals(线段树)

    题目链接: D. Closest Equals time limit per test 3 seconds memory limit per test 256 megabytes input stan ...

  2. C语言变量、函数的作用域及变量的存储方式

    一.变量的作用域和存储方式 在C语言中每个变量都有两种基本属性:数据类型.数据的存储类别. 数据类型很多人都已熟知,例如:字符型(char).整型(int).浮点型(float)等等.存储类别是指数据 ...

  3. Loj 504 ZQC的手办

    Loj 504 ZQC的手办 用线段树维护,每个节点存储区间内最小值 \(val\) 以及最小值出现的一个位置 \(pos\) . 对操作 \(1\) ,只需打标记即可,因为我们不维护其他的信息(如区 ...

  4. PHP 数组转json_encode,单个数组下标为了0时不对??

    在 php 数组转json时,假如 有一个数组下标是顺序的,他json_encode后会直接变成一个简版二维json, $arr = ['1'=>1,'2'=>2]; echo (json ...

  5. 《DSP using MATLAB》示例Example 6.12

    上代码: % x = -8:7 y = TwosComplement(x, 4) y = dec2bin(y, 4); disp(sprintf('%s', [y'; char(ones(1, 16) ...

  6. 接口测试基础——第6篇unittest模块(一)

    我们先来简单介绍一下unittest框架,先上代码,跟住了哦~~ 1.建立如下结构的文件夹: 注意,上面的文件夹都是package,也就是说你在new新建文件夹的时候不要选directory,而是要选 ...

  7. delete和truncate操作

    SQL> --查询表的结构SQL> desc student; 名称 是否为空? 类型 ----------------------------------------- -------- ...

  8. “RPC好,还是RESTful好?”

    REST 和 RESTful 什么区别?REST,即Representational State Transfer的缩写.翻译过来是表现层状态转换.如果一个架构符合REST原则,就称它为RESTful ...

  9. [MEF]第03篇 MEF延迟加载导出部件及元数据

    一.演示概述此演示介绍了MEF的延迟加载及元数据相关的内容.在实际的设计开发中,存在着某些对象是不需要在系统运行或者附属对象初始化的时候进行实例化的,只需要在使用到它的时候才会进行实例化,这种方式就可 ...

  10. Java中文件的常用操作

    一.文件的移动 File afile =new File("D:\\workspace\\Test\\test.avl");  if(afile.renameTo(new File ...