Java中設置多個Access-Control-Allow-Origin跨域訪問


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);
這樣就成功了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM