咸咸海风

https://github.com/xianxianhaifeng

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: :: :: 管理 ::

1、如果服务端是Java开发的,添加如下设置允许跨域即可,但是这样做是允许所有域名都可以访问,不够安全。

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

2、为保证安全性,可以只添加部分域名允许访问,添加位置可以在下面三处任选一个。

(1)可以在过滤器的filter的dofilter()方法种设置。

(2)可以在servlet的get或者post方法里面设置。

(3)可以放在访问的jsp页面第一行。

 

3、

在此用第一种方法,注意web.xml配置过滤器(filter)。

public void doFilter(ServletRequest req, ServletResponse res,FilterChain chain) throws IOException, ServletException {
        // 将ServletResponse转换为HttpServletResponse
        HttpServletResponse httpResponse = (HttpServletResponse) res;
        // 如果不是80端口,需要将端口加上,如果是集群,则用Nginx的地址,同理不是80端口要加上端口
	String []  allowDomain= {"http://www.baidu.com","http://123.456.789.10","http://123.16.12.23:8080"};
	Set allowedOrigins= new HashSet(Arrays.asList(allowDomain));
	String originHeader=((HttpServletRequest) req).getHeader("Origin");
	if (allowedOrigins.contains(originHeader)){
	    httpResponse.setHeader("Access-Control-Allow-Origin", originHeader);
            httpResponse.setContentType("application/json;charset=UTF-8");
            httpResponse.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
            httpResponse.setHeader("Access-Control-Max-Age", "3600");
            httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type,Access-Token");
            // 如果要把Cookie发到服务器,需要指定Access-Control-Allow-Credentials字段为true
            httpResponse.setHeader("Access-Control-Allow-Credentials", "true");                                
            httpResponse.setHeader("Access-Control-Expose-Headers", "*");        
        }        
        chain.doFilter(req, res);
}

  

在此用第二种方法,可以在servlet的get或者post方法里面设置。

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html;charset=UTF-8");
 
    // * 表示允许任何域名跨域访问
    response.setHeader("Access-Control-Allow-Origin", "*");
    // 指定特定域名可以访问
    response.setHeader("Access-Control-Allow-Origin", "http:localhost:8080/");
 
    //数据
    List<Student> studentList = getStudentList();
 
    JSONArray jsonArray = JSONArray.fromObject(studentList);
    String result = jsonArray.toString();
 
    //前端传过来的回调函数名称
    String callback = request.getParameter("callback");
    //用回调函数名称包裹返回数据,这样,返回数据就作为回调函数的参数传回去了
    result = callback + "(" + result + ")";
 
    response.getWriter().write(result);
}

 

(3)可以放在访问的jsp页面第一行

 

 

问题:

关于interceptor拦截器跨域response.addHeader("Access-Control-Allow-Origin", "*");不生效的情况

主要就是最上面的这行代码,当设置为“*”号的时候,我这边没有生效。

然后用的是,先取到发送过来的origin,然后将其放入header中。

String origin = request.getHeader("Origin");
response.setHeader("Access-Control-Allow-Origin", origin);
这样就成功了。

 
posted on 2020-03-27 14:52  咸咸海风  阅读(2542)  评论(0编辑  收藏  举报