java實(shí)現(xiàn)即時(shí)通信的完整步驟分享
前言
移動(dòng)社交是我們?nèi)粘I钪泻艹R姷能浖罱谧黾磿r(shí)通信,我用的是環(huán)信,和大家分享一下~~
環(huán)信的API都是基于JSON的,所以在構(gòu)造HTTP請(qǐng)求的時(shí)候,要指定請(qǐng)求頭:


注意==》環(huán)信API必須攜帶token才可以訪問(wèn)。
創(chuàng)建一個(gè)認(rèn)證類
public class Authentic {
private static Token token = new Token();
private TalkHttpService service;
public Authentic(TalkHttpService service) {
this.service = service;
}
public Authentic(TalkHttpService service, Token token) {
this.service = service;
if (token != null) {
Authentic.token = token;
}
}
public Token getToken() {
this.flush();
return token;
}
public void task() {
this.flush();
}
/**
* @describe 申請(qǐng)認(rèn)證 POST PUT 這兩種請(qǐng)求攜帶參數(shù)
* @author 何章懷曉 hezhanghuaixiao
* @date 2020/9/8 17:02
* @other
*/
public void applyAuthentication(HttpEntityEnclosingRequestBase request) {
this.flush();
request.addHeader("Authorization", "Bearer " + token.toString());
}
/**
* @describe 申請(qǐng)認(rèn)證 GET DELETE 這兩種請(qǐng)求不攜帶參數(shù)
* @author 何章懷曉 hezhanghuaixiao
* @date 2020/9/8 17:02
* @other
*/
public void applyAuthentication(HttpRequestBase request) {
this.flush();
request.addHeader("Authorization", "Bearer " + token.toString());
}
private void flush() {
synchronized (Authentic.class) {
try {
//如果超時(shí)
if (token.isExpire()) {
//判斷APPID和秘鑰信息
if (_Global.APP_CLIENT_ID != null && _Global.APP_CLIENT_SECRET != null) {
Map<String, Object> param = new HashMap<String, Object>();
param.put("grant_type", "client_credentials");
param.put("client_id", _Global.APP_CLIENT_ID);
param.put("client_secret", _Global.APP_CLIENT_SECRET);
//請(qǐng)求獲取token
TalkNode res = service
.request(_Global.URR_TOKEN, _Global.HTTP_METHOD_POST, param, null, null);
//成功獲取token
if (res != null && res.getAccess_token() != null && res.getExpires_in() != null
&& res.getExpires_in() > 0) {
//賦值
token = new Token(res.getAccess_token(),
res.getExpires_in() * 1000 + System.currentTimeMillis());
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
public static class Token {
private String token;
private Long expire;
public Token() {
}
public Token(String token, long expire) {
this.token = token;
this.expire = expire;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Long getExpire() {
return expire;
}
public void setExpire(Long expire) {
this.expire = expire;
}
public boolean isExpire() {
return expire == null || System.currentTimeMillis() > expire;
}
@Override
public String toString() {
return token;
}
}
}
創(chuàng)建請(qǐng)求接口
public interface TalkHttpService {
/**
@describe
@param
* @param url 請(qǐng)求地址
* @param method 請(qǐng)求方法
* @param param 參數(shù)
* @param auth 加密認(rèn)證
* @param field 字段轉(zhuǎn)換
@return com.hedashi.protal.model.TalkNode
@author 何章懷曉 hezhanghuaixiao
@date 2020/9/8 17:21
@other
*/
TalkNode request(String url, int method, Object param,
Authentic auth, String[][] field) throws Exception;
/**
@describe
@param
* @param url 請(qǐng)求地址
* @param file 文件名稱
* @param auth 加密認(rèn)證
* @param equal 字段轉(zhuǎn)換
@return com.hedashi.protal.model.TalkNode
@author 何章懷曉 hezhanghuaixiao
@date 2020/9/8 17:21
@other
*/
TalkNode upload(String url, File file, Authentic auth,
String[][] equal) throws Exception;
/**
@describe
@param
* @param url 請(qǐng)求地址
* @param file 文件名稱
* @param auth 加密認(rèn)證
* @param header 請(qǐng)求頭
@return void
@author 何章懷曉 hezhanghuaixiao
@date 2020/9/8 17:21
@other
*/
void downLoad(String url, File file, Authentic auth,
Map<String, String> header) throws Exception;
}
創(chuàng)建全局變量對(duì)不同模塊操作
/*
@describe 全局變量
@params
@return
@author 何章懷曉
@date 2020/7/30 9:30
@other
*/
public class _Global {
public static String APP_KEY = "";
public static String APP_CLIENT_ID = "";
public static String APP_CLIENT_SECRET = "";
//每頁(yè)數(shù)量
public static int APP_PAGE_SIZE = 10;
public static final int HTTP_METHOD_GET = 1;
public static final int HTTP_METHOD_POST = 2;
public static final int HTTP_METHOD_PUT = 3;
public static final int HTTP_METHOD_DELETE = 4;
public static final String URL_HOST = "http://a1.easemob.com/"+APP_KEY.replace("#","/")+"/";
public static final String URR_TOKEN = URL_HOST+"token";
public static final String URL_CHAT = URL_HOST+"chatmessages";
public static final String URL_GROUP = URL_HOST+"chatgroups";
public static final String URL_FILE = URL_HOST+"chatfiles";
public static final String URL_ROOM = URL_HOST+"chatrooms";
public static final String URL_MESSAGES = URL_HOST+"messages";
public static final String URL_USER = URL_HOST+"users";
}
請(qǐng)求管理類
package com.hedashi.protal.service.impl;
import com.hedashi.protal.model.TalkNode;
import com.hedashi.protal.model.Authentic;
import com.hedashi.protal.service.TalkHttpService;
import com.hedashi.protal.util.JsonTool;
import com.hedashi.protal.util._Global;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.URI;
import java.util.Map;
import java.util.Map.Entry;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.entity.StringEntity;
import org.apache.http.entity.mime.MultipartEntity;
import org.apache.http.entity.mime.content.ContentBody;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Service;
@Service
public class TalkHttpServiceImplApache implements TalkHttpService {
/**
@describe
@param
* @param url 請(qǐng)求路徑
* @param method 方式
* @param param 參數(shù)
* @param auth 認(rèn)證
* @param field 將相應(yīng)結(jié)果封裝到本地
@return com.hedashi.protal.model.TalkNode
@author 何章懷曉 hezhanghuaixiao
@date 2020/9/8 17:39
@other
*/
@Override
public TalkNode request(String url, int method, Object param,
Authentic auth, String[][] field) throws Exception {
//獲得可關(guān)閉的連接
CloseableHttpClient client = this.getClient();
try {
HttpResponse response = null;
//區(qū)分請(qǐng)求方式
switch (method) {
case _Global.HTTP_METHOD_GET:
//構(gòu)建請(qǐng)求
HttpGet get = new HttpGet(url);
if (auth != null) {
//如果未認(rèn)證 請(qǐng)求認(rèn)證
auth.applyAuthentication(get);
}
//固定請(qǐng)求頭信息為JSON
get.addHeader("Content-Type", "application/json");
response = client.execute(get);
break;
case _Global.HTTP_METHOD_POST:
HttpPost post = new HttpPost(url);
if (auth != null) {
auth.applyAuthentication(post);
}
//POST攜帶參數(shù)
if (param != null) {
//參數(shù)編碼放入請(qǐng)求體
post.setEntity(new StringEntity(JsonTool.write(param),
"UTF-8"));
}
post.addHeader("Content-Type", "application/json");
response = client.execute(post);
break;
case _Global.HTTP_METHOD_PUT:
HttpPut put = new HttpPut(url);
if (put != null) {
auth.applyAuthentication(put);
}
if (param != null) {
put.setEntity(new StringEntity(JsonTool.write(param),
"UTF-8"));
}
put.addHeader("Content-Type", "application/json");
response = client.execute(put);
break;
case _Global.HTTP_METHOD_DELETE:
HttpDelete delete = new HttpDelete(url);
if (auth != null) {
auth.applyAuthentication(delete);
}
delete.addHeader("Content-Type", "application/json");
response = client.execute(delete);
break;
default:
throw new Exception("非法請(qǐng)求方式");
}
int code = response.getStatusLine().getStatusCode();
//判斷返回code 如果為200
if (code == HttpStatus.SC_OK) {
//獲取響應(yīng)體
HttpEntity entity = response.getEntity();
if (entity != null) {
//解析
String json = EntityUtils.toString(entity, "UTF-8");
if (field != null && field.length > 0) {
for (String[] temp : field) {
json = json.replace(temp[0], temp[1]);
}
}
//解析為實(shí)體類
TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class);
talkNode.setStatusCode(code);
return talkNode;
}
} else {
//非200將code返回
return new TalkNode(code);
}
} catch (Exception e) {
throw e;
} finally {
client.close();
}
return null;
}
@Override
public TalkNode upload(String url, File file, Authentic auth,
String[][] equal) throws Exception {
CloseableHttpClient client = this.getClient();
try {
HttpPost post = new HttpPost();
post.setURI(new URI(url));
if (auth != null) {
auth.applyAuthentication(post);
}
post.addHeader("restrict-access", "true");
ContentBody body = new FileBody(file);
MultipartEntity part = new MultipartEntity();
part.addPart("file", body);
post.setEntity(part);
HttpResponse response = client.execute(post);
int code = response.getStatusLine().getStatusCode();
if (code == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
String json = EntityUtils.toString(entity, "UTF-8");
if (equal != null && equal.length > 0) {
for (String[] temp : equal) {
json = json.replace(temp[0], temp[1]);
}
}
TalkNode talkNode = (TalkNode) JsonTool.read(json, TalkNode.class);
talkNode.setStatusCode(code);
return talkNode;
}
}
} catch (Exception e) {
throw e;
} finally {
client.close();
}
return null;
}
@Override
public void downLoad(String url, File file, Authentic auth,
Map<String, String> header) throws Exception {
CloseableHttpClient client = this.getClient();
try {
HttpGet get = new HttpGet();
get.setURI(new URI(url));
if (auth != null) {
auth.applyAuthentication(get);
}
for (Entry<String, String> en : header.entrySet()) {
get.addHeader(en.getKey(), en.getValue());
}
HttpResponse response = client.execute(get);
if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
HttpEntity entity = response.getEntity();
if (entity != null) {
InputStream in = entity.getContent();
FileOutputStream fos = new FileOutputStream(file);
byte[] data = new byte[10 * 1024];
int len = 0;
while ((len = in.read(data)) != -1) {
fos.write(data, 0, len);
}
fos.flush();
fos.close();
in.close();
}
}
} catch (Exception e) {
throw e;
} finally {
client.close();
}
}
private CloseableHttpClient getClient() {
return HttpClients.createDefault();
}
}
創(chuàng)建業(yè)務(wù)請(qǐng)求和響應(yīng)格式類
package com.hedashi.protal.model;
import java.util.List;
import java.util.Map;
/**
@describe 根據(jù)不同的業(yè)務(wù)封裝不同的返回結(jié)果,該格式在發(fā)送請(qǐng)求的時(shí)候就被指定
@author 何章懷曉 hezhanghuaixiao
@date 2020/9/8 17:42
@other
*/
public class TalkNode {
public static final String[][] DATA_ENTITIES = new String[][]{{"entities", "entities_share"},
{"share-secret", "share_secret"}};
public static final String[][] DATA_ARRAY = new String[][]{{"data", "data_array"}};
public static final String[][] DATA_LIST = new String[][]{{"data", "data_list"}};
public static final String[][] DATA_MAP = new String[][]{{"data", "data_map"}};
public static final String[][] DATA_CHAT_LIST = new String[][]{{"entities", "data_chat_list"}};
public static final String[][] DATA_ROOM = new String[][]{{"data", "data_room"}};
public static final String[][] DATA_ROOM_LIST = new String[][]{{"data", "data_room_list"},
{"public", "public_room"}};
public static final String[][] DATA_ROOM_REDO = new String[][]{{"data", "data_room_rodo"}};
public static final String[][] DATA_ROOM_REDO_LIST = new String[][]{
{"data", "data_room_redo_list"}};
public static final String[][] DATA_GROUP = new String[][]{{"data", "data_group"}};
public static final String[][] DATA_GROUP_UPDATE = new String[][]{{"data", "data_group_update"}};
public static final String[][] DATA_GROUP_OWNER = new String[][]{{"data", "data_group_owner"}};
public static final String[][] DATA_GROUP_LIST = new String[][]{{"data", "data_group_list"}};
public static final String[][] DATA_GROUP_LIST_MEMBER = new String[][]{
{"data", "data_group_list_member"}};
public static final String[][] DATA_GROUP_LIST_NEW = new String[][]{
{"data", "data_group_list_new"}, {"public", "public_group"}};
public static final String[][] DATA_GROUP_FRIEND = new String[][]{{"data", "data_group_friend"}};
public static final String[][] DATA_GROUP_FRIEND_LIST = new String[][]{
{"data", "data_group_friend_list"}};
private String access_token;
private String action;
private String application;
private String applicationName;
private Long count;
private String cursor;
private Integer duration;
private Long expires_in;
private String organization;
private String path;
private Integer statusCode;
private Long timestamp;
private String uri;
private Map<String, Object> params;
private TalkUser user;
private List<TalkUser> entities;
private String[] data_array;
private Map<String, String> data_map;
private List<Map<String, Object>> data_list;
private List<TalkMsg> data_chat_list;
private TalkRoom data_room;
private List<TalkRoom> data_room_list;
private TalkRoomRedo data_room_rodo;
private List<TalkRoomRedo> data_room_redo_list;
private TalkGroup data_group;
private TalkGroupMember data_group_update;
private TalkGroupMember data_group_owner;
private List<TalkGroup> data_group_list;
private List<TalkGroupMember> data_group_list_member;
private List<TalkGroupNew> data_group_list_new;
private TalkGroupFriend data_group_friend;
private List<TalkGroupFriend> data_group_friend_list;
public TalkNode() {
}
public TalkNode(Integer statusCode) {
this.statusCode = statusCode;
}
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public String getAction() {
return action;
}
public void setAction(String action) {
this.action = action;
}
public String getApplication() {
return application;
}
public void setApplication(String application) {
this.application = application;
}
public String getApplicationName() {
return applicationName;
}
public void setApplicationName(String applicationName) {
this.applicationName = applicationName;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public String getCursor() {
return cursor;
}
public void setCursor(String cursor) {
this.cursor = cursor;
}
public Integer getDuration() {
return duration;
}
public void setDuration(Integer duration) {
this.duration = duration;
}
public Long getExpires_in() {
return expires_in;
}
public void setExpires_in(Long expires_in) {
this.expires_in = expires_in;
}
public String getOrganization() {
return organization;
}
public void setOrganization(String organization) {
this.organization = organization;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
public Integer getStatusCode() {
return statusCode;
}
public void setStatusCode(Integer statusCode) {
this.statusCode = statusCode;
}
public Long getTimestamp() {
return timestamp;
}
public void setTimestamp(Long timestamp) {
this.timestamp = timestamp;
}
public String getUri() {
return uri;
}
public void setUri(String uri) {
this.uri = uri;
}
public Map<String, Object> getParams() {
return params;
}
public void setParams(Map<String, Object> params) {
this.params = params;
}
public TalkUser getUser() {
return user;
}
public void setUser(TalkUser user) {
this.user = user;
}
public List<TalkUser> getEntities() {
return entities;
}
public void setEntities(List<TalkUser> entities) {
this.entities = entities;
}
public String[] getData_array() {
return data_array;
}
public void setData_array(String[] data_array) {
this.data_array = data_array;
}
public Map<String, String> getData_map() {
return data_map;
}
public void setData_map(Map<String, String> data_map) {
this.data_map = data_map;
}
public List<Map<String, Object>> getData_list() {
return data_list;
}
public void setData_list(List<Map<String, Object>> data_list) {
this.data_list = data_list;
}
public List<TalkMsg> getData_chat_list() {
return data_chat_list;
}
public void setData_chat_list(List<TalkMsg> data_chat_list) {
this.data_chat_list = data_chat_list;
}
public TalkRoom getData_room() {
return data_room;
}
public void setData_room(TalkRoom data_room) {
this.data_room = data_room;
}
public List<TalkRoom> getData_room_list() {
return data_room_list;
}
public void setData_room_list(List<TalkRoom> data_room_list) {
this.data_room_list = data_room_list;
}
public TalkRoomRedo getData_room_rodo() {
return data_room_rodo;
}
public void setData_room_rodo(TalkRoomRedo data_room_rodo) {
this.data_room_rodo = data_room_rodo;
}
public List<TalkRoomRedo> getData_room_redo_list() {
return data_room_redo_list;
}
public void setData_room_redo_list(List<TalkRoomRedo> data_room_redo_list) {
this.data_room_redo_list = data_room_redo_list;
}
public TalkGroup getData_group() {
return data_group;
}
public void setData_group(TalkGroup data_group) {
this.data_group = data_group;
}
public TalkGroupMember getData_group_update() {
return data_group_update;
}
public void setData_group_update(TalkGroupMember data_group_update) {
this.data_group_update = data_group_update;
}
public TalkGroupMember getData_group_owner() {
return data_group_owner;
}
public void setData_group_owner(TalkGroupMember data_group_owner) {
this.data_group_owner = data_group_owner;
}
public List<TalkGroup> getData_group_list() {
return data_group_list;
}
public void setData_group_list(List<TalkGroup> data_group_list) {
this.data_group_list = data_group_list;
}
public List<TalkGroupMember> getData_group_list_member() {
return data_group_list_member;
}
public void setData_group_list_member(
List<TalkGroupMember> data_group_list_member) {
this.data_group_list_member = data_group_list_member;
}
public List<TalkGroupNew> getData_group_list_new() {
return data_group_list_new;
}
public void setData_group_list_new(List<TalkGroupNew> data_group_list_new) {
this.data_group_list_new = data_group_list_new;
}
public TalkGroupFriend getData_group_friend() {
return data_group_friend;
}
public void setData_group_friend(TalkGroupFriend data_group_friend) {
this.data_group_friend = data_group_friend;
}
public List<TalkGroupFriend> getData_group_friend_list() {
return data_group_friend_list;
}
public void setData_group_friend_list(
List<TalkGroupFriend> data_group_friend_list) {
this.data_group_friend_list = data_group_friend_list;
}
}
工具類
public class HuanXinUtil {
private static TalkDataService service = null;
/**
@describe 初始化
@param
* @param
@return void
@author 何章懷曉 hezhanghuaixiao
@date 2020/9/8 17:26
@other
*/
private static void init(){
if(service == null){
// 初始服務(wù)端Token
Authentic.Token token = new Authentic(new TalkHttpServiceImplApache()).getToken();
//token和過(guò)期時(shí)間
Authentic.Token TEST_TOKEN = new Authentic.Token(token.getToken(),token.getExpire());
//新建一個(gè)鏈接服務(wù)
service = new TalkDataServiceImpl(new TalkHttpServiceImplApache());
// 修改數(shù)據(jù)業(yè)務(wù)Token
service.setToken(TEST_TOKEN);
}
}
/**
@describe 添加管理員
@param
* @param groupId 群組id
* @param userid 管理員id
@return boolean
@author 何章懷曉 hezhanghuaixiao
@date 2020/9/8 17:54
@other
*/
public static boolean addGroupManager(String groupId,String userid) {
try {
init();
TalkNode talkNode = service.addGroupManager(groupId,userid);
if(talkNode.getStatusCode()==200){
return true;
}
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
}
service調(diào)用
@Override
public TalkNode addGroupManager(String id, String userId) throws Exception {
Map<String, Object> param = new HashMap<String, Object>();
param.put("newadmin", userId);
return service.request(_Global.URL_GROUP + "/" + id + "/admin",
_Global.HTTP_METHOD_POST, param, auth, TalkNode.DATA_GROUP);
}
/**
* @param [groupId, managerId]
* @return com.hedashi.common.api.CommonResult
* @describe 后臺(tái)添加群組管理員
* @author 何章懷曉 hezhanghuaixiao
* @date 2020/9/8 14:28
* @other
*/
@Override
public CommonResult addGroupManager(String groupId, String managerId) {
boolean b = HuanXinUtil.addGroupManager(groupId, managerId);
if(b){
System.out.println("環(huán)信添加管理員成功==========================");
//本地添加管理員
addGroupAdmin(groupId,managerId);
return CommonResult.success("SUCCESS");
}
return CommonResult.failed("FAILED");
}
@ApiOperation(value = "群組添加管理員")
@RequestMapping(value = "/addGroupManager", method = RequestMethod.POST)
@ResponseBody
public CommonResult<HeAdmin> addGroupManager(
@RequestParam @ApiParam(value = "群組環(huán)信ID", required = true) String groupId,
@RequestParam @ApiParam(value = "管理員環(huán)信id", required = true) String managerId
) {
return heUGroupService.addGroupManager(groupId,managerId);
}
swagger調(diào)用

token 信息
{“application”:“53e3eeb5-6926-46dd-bc61-4e214342ef7e”,“access_token”:“YWMtXDS-uPG6EeqItFktBQxljAAAAAAAAAAAAAAAAAAAAAFT4-61aSZG3bxhTiFDQu9-AgMAAAF0bSppWwBPGgBXDkgrlvguBLEe966D_LnbgNyNz2OOsTgP4okhQGoOdA”,“expires_in”:5184000}
swagger返回結(jié)果

控制臺(tái)

數(shù)據(jù)庫(kù):

總結(jié)
到此這篇關(guān)于java實(shí)現(xiàn)即時(shí)通信的文章就介紹到這了,更多相關(guān)java實(shí)現(xiàn)即時(shí)通信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
java中volatile關(guān)鍵字的作用與實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于java中volatile關(guān)鍵字的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04
java8根據(jù)某一屬性過(guò)濾去重的實(shí)例
這篇文章主要介紹了java8根據(jù)某一屬性過(guò)濾去重的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
springboot實(shí)現(xiàn)簡(jiǎn)單的消息對(duì)話的示例代碼
本文主要介紹了springboot實(shí)現(xiàn)簡(jiǎn)單的消息對(duì)話的示例代碼,可以使用WebSocket技術(shù),WebSocket是一種在客戶端和服務(wù)器之間提供實(shí)時(shí)雙向通信的協(xié)議,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制
這篇文章主要介紹了Java基礎(chǔ)之ArrayList的擴(kuò)容機(jī)制,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java基礎(chǔ)的小伙伴們有很好的幫助,需要的朋友可以參考下2021-05-05
spring boot使用logback實(shí)現(xiàn)多環(huán)境日志配置詳解
這篇文章主要介紹了spring boot使用logback實(shí)現(xiàn)多環(huán)境日志配置詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Springboot處理CORS跨域請(qǐng)求的三種方法
這篇文章主要介紹了Springboot處理CORS跨域請(qǐng)求的三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-06-06
Java實(shí)現(xiàn)的猴子吃桃問(wèn)題算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)的猴子吃桃問(wèn)題算法,簡(jiǎn)單描述了猴子吃桃問(wèn)題并結(jié)合實(shí)例形式給出了java解決猴子吃桃問(wèn)題的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-10-10
Java和scala實(shí)現(xiàn) Spark RDD轉(zhuǎn)換成DataFrame的兩種方法小結(jié)
今天小編就為大家分享一篇Java和scala實(shí)現(xiàn) Spark RDD轉(zhuǎn)換成DataFrame的兩種方法小結(jié),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-06-06

