解决“跨域问题”的几种方法
(0)使用注解方式,這個(gè)可能有些框架可以,有些不行,在要訪問(wèn)的方法前面加上此注解即可:
@CrossOrigin(1)使用?Access-Control-Allow-Origin 設(shè)置請(qǐng)求響應(yīng)頭,簡(jiǎn)潔有效。
(后臺(tái))被請(qǐng)求的方法,設(shè)置請(qǐng)求響應(yīng)頭:
response.setHeader("Access-Control-Allow-Origin","*"); //response 來(lái)自 HttpServletResponse(前端)前端js的ajax中,數(shù)據(jù)類(lèi)型使用json,不能使用 “jsonp” //自己一開(kāi)始就是寫(xiě)成 jsonp,結(jié)果半天不起作用
dataType : "json",【當(dāng)然最好的方法是寫(xiě)一個(gè)過(guò)濾器,不要在每個(gè)被請(qǐng)求的方法里面都添加這句,如果寫(xiě)過(guò)濾器的話,doFilter() 方法中參數(shù) response 類(lèi)型為 ServletResponse,需要強(qiáng)轉(zhuǎn)成?HttpServletResponse 類(lèi)型,才可以設(shè)置 setHeader() 請(qǐng)求頭】
(2)使用 httpClient 做后臺(tái)中轉(zhuǎn),避開(kāi)前端跨域問(wèn)題。
1、創(chuàng)建 httpClient 工具類(lèi)(可以直接復(fù)制使用,修改一下包名路徑即可)
package 自己包名路徑;import java.io.IOException;import org.apache.http.HttpEntity; import org.apache.http.HttpStatus; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.util.EntityUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory;import com.alibaba.fastjson.JSONObject;public class HttpClientUtils {private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class); // 日志記錄private static RequestConfig requestConfig = null;static {// 設(shè)置請(qǐng)求和傳輸超時(shí)時(shí)間requestConfig = RequestConfig.custom().setSocketTimeout(2000).setConnectTimeout(2000).build();}/*** post請(qǐng)求傳輸json參數(shù)* * @param url* url地址* @param json* 參數(shù)* @return*/public static JSONObject httpPost(String url, JSONObject jsonParam) {// post請(qǐng)求返回結(jié)果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);// 設(shè)置請(qǐng)求和傳輸超時(shí)時(shí)間 httpPost.setConfig(requestConfig);try {if (null != jsonParam) {// 解決中文亂碼問(wèn)題StringEntity entity = new StringEntity(jsonParam.toString(), "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/json");httpPost.setEntity(entity);}CloseableHttpResponse result = httpClient.execute(httpPost);// 請(qǐng)求發(fā)送成功,并得到響應(yīng)if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 讀取服務(wù)器返回過(guò)來(lái)的json字符串?dāng)?shù)據(jù)str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串轉(zhuǎn)換成json對(duì)象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post請(qǐng)求提交失敗:" + url, e);}}} catch (IOException e) {logger.error("post請(qǐng)求提交失敗:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** post請(qǐng)求傳輸String參數(shù) 例如:name=Jack&sex=1&type=2* Content-type:application/x-www-form-urlencoded* * @param url* url地址* @param strParam* 參數(shù)* @return*/public static JSONObject httpPost(String url, String strParam) {// post請(qǐng)求返回結(jié)果CloseableHttpClient httpClient = HttpClients.createDefault();JSONObject jsonResult = null;HttpPost httpPost = new HttpPost(url);httpPost.setConfig(requestConfig);try {if (null != strParam) {// 解決中文亂碼問(wèn)題StringEntity entity = new StringEntity(strParam, "utf-8");entity.setContentEncoding("UTF-8");entity.setContentType("application/x-www-form-urlencoded");httpPost.setEntity(entity);}CloseableHttpResponse result = httpClient.execute(httpPost);// 請(qǐng)求發(fā)送成功,并得到響應(yīng)if (result.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {String str = "";try {// 讀取服務(wù)器返回過(guò)來(lái)的json字符串?dāng)?shù)據(jù)str = EntityUtils.toString(result.getEntity(), "utf-8");// 把json字符串轉(zhuǎn)換成json對(duì)象jsonResult = JSONObject.parseObject(str);} catch (Exception e) {logger.error("post請(qǐng)求提交失敗:" + url, e);}}} catch (IOException e) {logger.error("post請(qǐng)求提交失敗:" + url, e);} finally {httpPost.releaseConnection();}return jsonResult;}/*** 發(fā)送get請(qǐng)求* * @param url* 路徑* @return*/public static JSONObject httpGet(String url) {// get請(qǐng)求返回結(jié)果JSONObject jsonResult = null;CloseableHttpClient client = HttpClients.createDefault();// 發(fā)送get請(qǐng)求HttpGet request = new HttpGet(url);request.setConfig(requestConfig);try {CloseableHttpResponse response = client.execute(request);// 請(qǐng)求發(fā)送成功,并得到響應(yīng)if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {// 讀取服務(wù)器返回過(guò)來(lái)的json字符串?dāng)?shù)據(jù)HttpEntity entity = response.getEntity();String strResult = EntityUtils.toString(entity, "utf-8");// 把json字符串轉(zhuǎn)換成json對(duì)象jsonResult = JSONObject.parseObject(strResult);} else {logger.error("get請(qǐng)求提交失敗:" + url);}} catch (IOException e) {logger.error("get請(qǐng)求提交失敗:" + url, e);} finally {request.releaseConnection();}return jsonResult;} }?2、在A項(xiàng)目下新建中轉(zhuǎn)類(lèi),添加中轉(zhuǎn)方法(其實(shí)就是一個(gè)controller類(lèi),注意注解使用 @RestController ,使用 @Controller 會(huì)取不到數(shù)據(jù))
package 自己包名路徑;import java.util.HashMap; import java.util.Map;import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;import com.alibaba.fastjson.JSONObject; import com.chang.util.HttpClientUtils;@RestController public class Azhong {//中轉(zhuǎn)方法@RequestMapping("/forwardB")public Map<String,Object> forwardB() {System.out.println("進(jìn)來(lái)A的中轉(zhuǎn)站了");JSONObject jb = HttpClientUtils.httpGet("要訪問(wèn)的B項(xiàng)目的方法的路徑");
//下面是自己具體的業(yè)務(wù)處理,這里只是demo測(cè)試Map<String, Object> map = new HashMap<String, Object>();map.put("retCode", jb.get("retCode").toString());map.put("retMsg", jb.get("retMsg").toString());
return map;} }
?3、前端 ajax 的?url : "http://A項(xiàng)目路徑/forwardB", 數(shù)據(jù)類(lèi)型 dataType : "json"?
url : "http://A項(xiàng)目路徑/forwardB", //訪問(wèn)自己的中轉(zhuǎn)方法dataType : json
?
轉(zhuǎn)載于:https://www.cnblogs.com/xuehuashanghe/p/9687066.html
總結(jié)
以上是生活随笔為你收集整理的解决“跨域问题”的几种方法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 农行信用卡消费备用金上征信吗?逾期还款会
- 下一篇: 光大本来生活联名信用卡额度多少?这几个因