From be4f31de1e02889b54b58a518b641b485e7c625c Mon Sep 17 00:00:00 2001 From: dingxl Date: Fri, 28 Feb 2020 19:13:37 +0800 Subject: [PATCH 01/20] Update audio file, remove unused files --- HelloAudio/pom.xml | 32 --- HelloAudio/rec.wav | Bin 155692 -> 0 bytes HelloAudio/src/main/java/com/hello/App.java | 7 +- .../main/java/com/hello/audio/ChatUtil.java | 36 --- .../main/java/com/hello/http/HttpUtil.java | 247 ------------------ .../main/java/com/hello/http/RespData.java | 107 -------- .../main/java/com/hello/http/RespJsonObj.java | 31 --- .../src/main/java/com/hello/http/RespStr.java | 26 -- .../src/main/java/com/hello/http/UrlUtil.java | 33 --- .../src/main/java/com/hello/util/B64Util.java | 42 --- .../main/java/com/hello/util/JsonUtil.java | 80 ------ .../src/main/java/com/hello/util/LogUtil.java | 40 --- .../src/main/java/com/hello/util/StrUtil.java | 192 -------------- 13 files changed, 3 insertions(+), 870 deletions(-) delete mode 100644 HelloAudio/rec.wav delete mode 100644 HelloAudio/src/main/java/com/hello/audio/ChatUtil.java delete mode 100644 HelloAudio/src/main/java/com/hello/http/HttpUtil.java delete mode 100644 HelloAudio/src/main/java/com/hello/http/RespData.java delete mode 100644 HelloAudio/src/main/java/com/hello/http/RespJsonObj.java delete mode 100644 HelloAudio/src/main/java/com/hello/http/RespStr.java delete mode 100644 HelloAudio/src/main/java/com/hello/http/UrlUtil.java delete mode 100644 HelloAudio/src/main/java/com/hello/util/B64Util.java delete mode 100644 HelloAudio/src/main/java/com/hello/util/JsonUtil.java delete mode 100644 HelloAudio/src/main/java/com/hello/util/LogUtil.java delete mode 100644 HelloAudio/src/main/java/com/hello/util/StrUtil.java diff --git a/HelloAudio/pom.xml b/HelloAudio/pom.xml index 4e804a1..d0e3504 100644 --- a/HelloAudio/pom.xml +++ b/HelloAudio/pom.xml @@ -21,33 +21,11 @@ - - org.apache.commons - commons-collections4 - 4.4 - org.apache.commons commons-lang3 3.7 - - com.alibaba - fastjson - 1.2.60 - - - - - org.apache.httpcomponents - httpclient - 4.5.2 - - - org.apache.httpcomponents - httpmime - 4.5 - junit @@ -55,16 +33,6 @@ 4.11 test - - org.slf4j - slf4j-api - 1.7.7 - - - org.slf4j - slf4j-log4j12 - 1.7.7 - diff --git a/HelloAudio/rec.wav b/HelloAudio/rec.wav deleted file mode 100644 index 57b2871f16c2116405c634aa62a482dc59c42841..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155692 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
x3b2U^^{)VGRL>WSM_F?jxPd2!& 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 -eF_HeY4Y`KpMuw;{PMd6@`y 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 {{ - put("size", data.size()); - put("format", "wav"); - put("audio", B64Util.encode(data.toByteArray())); - }}, resp - ); - System.out.printf("%s, %s, %s, %d, %d\n", - resp.getContentType(), resp.getFileName(), resp.getFileExt(), - resp.getContentLength(), ret == null ? 0 : ret.length - ); - - if (ret != null && ret.length > 0) { - Player.asyncPlay(ret); - } else { - // 播放自己的声音吧 - recordHelper.play(); - } - } -} diff --git a/HelloAudio/src/main/java/com/hello/http/HttpUtil.java b/HelloAudio/src/main/java/com/hello/http/HttpUtil.java deleted file mode 100644 index c336d08..0000000 --- a/HelloAudio/src/main/java/com/hello/http/HttpUtil.java +++ /dev/null @@ -1,247 +0,0 @@ -package com.hello.http; - -import com.hello.util.JsonUtil; -import com.hello.util.LogUtil; -import com.hello.util.StrUtil; -import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.collections4.MapUtils; -import org.apache.http.HttpEntity; -import org.apache.http.NameValuePair; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.ResponseHandler; -import org.apache.http.client.config.RequestConfig; -import org.apache.http.client.entity.UrlEncodedFormEntity; -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.client.methods.HttpRequestBase; -import org.apache.http.config.Registry; -import org.apache.http.config.RegistryBuilder; -import org.apache.http.conn.socket.ConnectionSocketFactory; -import org.apache.http.conn.socket.PlainConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.conn.ssl.SSLContextBuilder; -import org.apache.http.conn.ssl.TrustSelfSignedStrategy; -import org.apache.http.entity.ContentType; -import org.apache.http.entity.StringEntity; -import org.apache.http.entity.mime.MultipartEntityBuilder; -import org.apache.http.entity.mime.content.StringBody; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.DefaultHttpRequestRetryHandler; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; -import org.apache.http.message.BasicNameValuePair; - -import java.io.File; -import java.io.IOException; -import java.security.KeyManagementException; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.Map; - -public class HttpUtil { - private static final String CHARSET_UTF_8 = "utf-8"; - private static final String CONTENT_TYPE_FORM = "application/x-www-form-urlencoded;charset=utf-8"; - private static final String CONTENT_TYPE_JSON = "application/json;charset=utf-8"; - - private static final int MAX_TOTAL = 100; - private static final int MAX_PER_ROUTE = 20; - - private static final int SOCKET_TIMEOUT = 10000; - private static final int CONNECT_TIMEOUT = 10000; - private static final int REQUEST_TIMEOUT = 10000; - - private static PoolingHttpClientConnectionManager connectionPool; - private static RequestConfig requestConfig; - - static { - try { - SSLContextBuilder builder = new SSLContextBuilder(); - builder.loadTrustMaterial(null, new TrustSelfSignedStrategy()); - SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build()); - Registry socketFactoryRegistry = RegistryBuilder.create() - .register("http", PlainConnectionSocketFactory.getSocketFactory()) - .register("https", sslsf) - .build(); - - connectionPool = new PoolingHttpClientConnectionManager(socketFactoryRegistry); - connectionPool.setMaxTotal(MAX_TOTAL); - connectionPool.setDefaultMaxPerRoute(MAX_PER_ROUTE); - } catch (KeyStoreException e) { - e.printStackTrace(); - } catch (KeyManagementException e) { - e.printStackTrace(); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - - requestConfig = RequestConfig.custom() - .setSocketTimeout(SOCKET_TIMEOUT) - .setConnectTimeout(CONNECT_TIMEOUT) - .setConnectionRequestTimeout(REQUEST_TIMEOUT) - .build(); - } - - private static CloseableHttpClient getHttpClient() { - return HttpClients.custom() - .setConnectionManager(connectionPool) - .setDefaultRequestConfig(requestConfig) - .setRetryHandler(new DefaultHttpRequestRetryHandler(0, false)) - .build(); - } - - private static T sendHttpRequest(HttpRequestBase httpRequest, ResponseHandler handler) { - try { - return getHttpClient().execute(httpRequest, handler); - } catch (ClientProtocolException e) { - LogUtil.error("Error when sendHttpRequest", e.getMessage()); - } catch (IOException e) { - LogUtil.error("Error when sendHttpRequest", e.getMessage()); - } - return null; - } - - public static T sendHttpGet(String httpUrl, ResponseHandler handler) { - HttpGet httpGet = new HttpGet(httpUrl); - return sendHttpRequest(httpGet, handler); - } - - public static String sendHttpGet(String httpUrl) { - return sendHttpGet(httpUrl, new RespStr()); - } - - public static T sendHttpGet(String httpUrl, Map headers, ResponseHandler handler) { - HttpGet httpGet = new HttpGet(httpUrl); - fillHeaders(httpGet, headers); - return sendHttpRequest(httpGet, handler); - } - - public static String sendHttpGet(String httpUrl, Map headers) { - HttpGet httpGet = new HttpGet(httpUrl); - fillHeaders(httpGet, headers); - return sendHttpRequest(httpGet, new RespStr()); - } - - public static T sendHttpGet(String httpUrl, Map headers, Map params, ResponseHandler handler) { - if (!MapUtils.isEmpty(params)) { - List paramList = new ArrayList(); - for (Map.Entry param : params.entrySet()) { - Object value = param.getValue(); - if (value != null) { - paramList.add(String.format("%s=%s", param.getKey(), UrlUtil.encode(String.valueOf(value)))); - } - } - - String paramStr = StrUtil.join(paramList, "&"); - httpUrl = String.format("%s%s%s", httpUrl, httpUrl.indexOf("?") > 0 ? "&" : "?", paramStr); - } - return sendHttpGet(httpUrl, headers, handler); - } - - public static String sendHttpGet(String httpUrl, Map headers, Map params) { - return sendHttpGet(httpUrl, headers, params, new RespStr()); - } - - public static T sendHttpPost(String httpUrl, Map headers, Map params, ResponseHandler handler) { - HttpPost httpPost = new HttpPost(httpUrl); - fillHeaders(httpPost, headers); - - if (!MapUtils.isEmpty(params)) { - String jsonStr = JsonUtil.toStr(params); - StringEntity stringEntity = new StringEntity(jsonStr, "UTF-8"); - stringEntity.setContentType(CONTENT_TYPE_JSON); - httpPost.setEntity(stringEntity); - } - return sendHttpRequest(httpPost, handler); - } - - public static String sendHttpPost(String httpUrl, Map headers, Map params) { - return sendHttpPost(httpUrl, headers, params, new RespStr()); - } - - public static T sendHttpPost(String httpUrl, Map headers, Map params, File file, ResponseHandler handler) { - File[] files = new File[]{file}; - return sendHttpPost(httpUrl, headers, params, Arrays.asList(files), handler); - } - - public static T sendHttpPost(String httpUrl, Map headers, Map params, Collection files, ResponseHandler handler) { - HttpPost httpPost = new HttpPost(httpUrl); - fillHeaders(httpPost, headers); - - MultipartEntityBuilder meBuilder = MultipartEntityBuilder.create(); - if (!MapUtils.isEmpty(params)) { - for (String key : params.keySet()) { - Object value = params.get(key); - if (value != null) { - meBuilder.addPart(key, new StringBody(String.valueOf(value), ContentType.TEXT_PLAIN)); - } - } - } - - if (!CollectionUtils.isEmpty(files)) { - for (File file : files) { - meBuilder.addBinaryBody("file", file); - } - } - - HttpEntity reqEntity = meBuilder.build(); - httpPost.setEntity(reqEntity); - return sendHttpRequest(httpPost, handler); - } - - public static T sendHttpForm(String httpUrl, Map headers, Map params, ResponseHandler handler) { - HttpPost httpPost = new HttpPost(httpUrl); - fillHeaders(httpPost, headers); - - if (!MapUtils.isEmpty(params)) { - List pairs = new ArrayList(params.size()); - for (Map.Entry param : params.entrySet()) { - Object value = param.getValue(); - if (value != null) { - pairs.add(new BasicNameValuePair(param.getKey(), String.valueOf(value))); - } - } - - try { - httpPost.setEntity(new UrlEncodedFormEntity(pairs)); - } catch (Exception e) { - LogUtil.error("Error when sendHttpSubmit", e.getMessage()); - } - } - return sendHttpRequest(httpPost, handler); - } - - public static T sendHttpPut(String httpUrl, Map headers, Map params, ResponseHandler handler) { - HttpPut httpPut = new HttpPut(httpUrl); - fillHeaders(httpPut, headers); - - if (!MapUtils.isEmpty(params)) { - String jsonStr = JsonUtil.toStr(params); - StringEntity stringEntity = new StringEntity(jsonStr, "UTF-8"); - stringEntity.setContentType(CONTENT_TYPE_JSON); - httpPut.setEntity(stringEntity); - } - return sendHttpRequest(httpPut, handler); - } - - public static T sendHttpDelete(String httpUrl, Map headers, ResponseHandler handler) { - HttpDelete httpDelete = new HttpDelete(httpUrl); - fillHeaders(httpDelete, headers); - return sendHttpRequest(httpDelete, handler); - } - - private static void fillHeaders(HttpRequestBase request, Map headers) { - if (request == null || MapUtils.isEmpty(headers)) { - return; - } - - for (Map.Entry header : headers.entrySet()) { - request.addHeader(header.getKey(), header.getValue()); - } - } -} diff --git a/HelloAudio/src/main/java/com/hello/http/RespData.java b/HelloAudio/src/main/java/com/hello/http/RespData.java deleted file mode 100644 index 69d4eb3..0000000 --- a/HelloAudio/src/main/java/com/hello/http/RespData.java +++ /dev/null @@ -1,107 +0,0 @@ -package com.hello.http; - -import com.hello.util.LogUtil; -import com.hello.util.StrUtil; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.ResponseHandler; -import org.apache.http.util.EntityUtils; - -import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; - -public class RespData implements ResponseHandler { - private byte[] bytes; - private String fileName; - private String fileExt; - private String contentType; - private String contentLength; - - public byte[] getBytes() { - return bytes; - } - - public String getFileName() { - return fileName; - } - - public String getFileExt() { - return fileExt; - } - - public String getContentType() { - return contentType; - } - - public int getContentLength() { - return StrUtil.isEmpty(contentLength) ? 0 : Integer.valueOf(contentLength); - } - - public String saveFile(String filePath) { - if (StrUtil.isEmpty(filePath)) { - filePath = fileName; - } - if (StrUtil.isEmpty(filePath) || bytes == null || bytes.length <= 0) { - return null; - } - - // Check path - File file = new File(filePath); - String fileName = file.getName(); - filePath = file.getParent(); - - file = new File(filePath == null ? "tmp" : filePath); - if (!file.exists() && !file.mkdirs()) { - return null; - } - - // Write to disc - Path path = Paths.get(file.getPath(), fileName); - try { - Files.write(path, bytes); - } catch (IOException e) { - LogUtil.error("Fail to save file: %s, %s\n", path.toString(), e.getMessage()); - return null; - } - return path.toString(); - } - - private String getHeader(HttpResponse response, String header) { - return response.containsHeader(header) ? response.getFirstHeader(header).getValue() : null; - } - - @Override - public byte[] handleResponse(HttpResponse response) throws IOException { - // 判断响应状态 - if (response.getStatusLine().getStatusCode() >= 300) { - throw new IOException("HTTP Request is not success, Response code is " + response.getStatusLine().getStatusCode()); - } - - // 读取文件名称,Header: Content-Disposition: attachment;fileName=abc.txt - String disposition = getHeader(response, "Content-Disposition"); - if (!StrUtil.isEmpty(disposition) && disposition.contains("=")) { - fileName = disposition.split("=")[1]; - } - - // 读取ContentType: audio/mp3 - contentType = getHeader(response, "Content-Type"); - if (!StrUtil.isEmpty(contentType) && contentType.contains("/")) { - fileExt = contentType.split("/")[1]; - } - - contentLength = getHeader(response, "Content-Length"); - - // 读取返回内容 - HttpEntity entity = response.getEntity(); - if (entity == null) { - throw new ClientProtocolException("Response contains no content"); - } - - bytes = EntityUtils.toByteArray(entity); - return bytes; - } -} diff --git a/HelloAudio/src/main/java/com/hello/http/RespJsonObj.java b/HelloAudio/src/main/java/com/hello/http/RespJsonObj.java deleted file mode 100644 index 44fc5ff..0000000 --- a/HelloAudio/src/main/java/com/hello/http/RespJsonObj.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.hello.http; - -import com.alibaba.fastjson.JSONObject; -import com.hello.util.JsonUtil; -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.ResponseHandler; -import org.apache.http.entity.ContentType; -import org.apache.http.util.EntityUtils; - -import java.io.IOException; -import java.nio.charset.Charset; - -public class RespJsonObj implements ResponseHandler { - @Override - public JSONObject handleResponse(HttpResponse resp) throws IOException { - HttpEntity entity = resp.getEntity(); - if (entity == null) { - throw new ClientProtocolException("Response contains no content"); - } - - // read content - ContentType contentType = ContentType.getOrDefault(entity); - Charset charset = contentType.getCharset(); - String jsonStr = EntityUtils.toString(entity, charset == null ? Charset.forName("utf-8") : charset); - - // parse JSON object - return JsonUtil.parseObj(jsonStr); - } -} diff --git a/HelloAudio/src/main/java/com/hello/http/RespStr.java b/HelloAudio/src/main/java/com/hello/http/RespStr.java deleted file mode 100644 index ccaf5ee..0000000 --- a/HelloAudio/src/main/java/com/hello/http/RespStr.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.hello.http; - -import org.apache.http.HttpEntity; -import org.apache.http.HttpResponse; -import org.apache.http.client.ClientProtocolException; -import org.apache.http.client.ResponseHandler; -import org.apache.http.entity.ContentType; -import org.apache.http.util.EntityUtils; - -import java.io.IOException; -import java.nio.charset.Charset; - -public class RespStr implements ResponseHandler { - @Override - public String handleResponse(HttpResponse httpResponse) throws IOException { - HttpEntity entity = httpResponse.getEntity(); - if (entity == null) { - throw new ClientProtocolException("Response contains no content"); - } - - // 读取返回内容 - ContentType contentType = ContentType.getOrDefault(entity); - Charset charset = contentType.getCharset(); - return EntityUtils.toString(entity, charset == null ? Charset.forName("utf-8") : charset); - } -} diff --git a/HelloAudio/src/main/java/com/hello/http/UrlUtil.java b/HelloAudio/src/main/java/com/hello/http/UrlUtil.java deleted file mode 100644 index 7899028..0000000 --- a/HelloAudio/src/main/java/com/hello/http/UrlUtil.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.hello.http; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; -import java.net.URLEncoder; - -public class UrlUtil { - public static String encode(String str) { - if (str == null) { - return null; - } - - try { - return URLEncoder.encode(str, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return null; - } - - public static String decode(String str) { - if (str == null) { - return null; - } - - try { - return URLDecoder.decode(str, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/HelloAudio/src/main/java/com/hello/util/B64Util.java b/HelloAudio/src/main/java/com/hello/util/B64Util.java deleted file mode 100644 index 4d9e7b9..0000000 --- a/HelloAudio/src/main/java/com/hello/util/B64Util.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.hello.util; - -import org.apache.commons.codec.binary.Base64; - -import java.io.UnsupportedEncodingException; - -public class B64Util { - public static String encode(String str) { - if (str == null) { - return null; - } - - try { - return encode(str.getBytes("UTF-8")); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return null; - } - - public static String encode(byte[] bytes) { - return bytes == null ? null : Base64.encodeBase64String(bytes); - } - - public static String decode(String str) { - if (str == null) { - return null; - } - - byte[] bytes = decodeForBytes(str); - try { - return new String(bytes, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return null; - } - - public static byte[] decodeForBytes(String str) { - return str == null ? null : Base64.decodeBase64(str); - } -} diff --git a/HelloAudio/src/main/java/com/hello/util/JsonUtil.java b/HelloAudio/src/main/java/com/hello/util/JsonUtil.java deleted file mode 100644 index fcd90ca..0000000 --- a/HelloAudio/src/main/java/com/hello/util/JsonUtil.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.hello.util; - -import com.alibaba.fastjson.JSONArray; -import com.alibaba.fastjson.JSONObject; - -import java.util.List; - -public class JsonUtil { - public static String toStr(Object javaObj) { - return javaObj == null ? null : JSONObject.toJSONString(javaObj); - } - - public static JSONObject parseObj(String jsonStr) { - if (StrUtil.isEmpty(jsonStr)) { - return null; - } - - try { - return JSONObject.parseObject(jsonStr); - } catch (Exception e) { - String msg = e.getMessage(); - if (msg != null && msg.length() > 100) { - msg = msg.substring(0, 100); - } - LogUtil.warn("Exception when parseJson", msg); - } - return null; - } - - public static T parseObj(String jsonStr, Class clazz) { - if (StrUtil.isEmpty(jsonStr)) { - return null; - } - - try { - return JSONObject.parseObject(jsonStr, clazz); - } catch (Exception e) { - String msg = e.getMessage(); - if (msg != null && msg.length() > 100) { - msg = msg.substring(0, 100); - } - LogUtil.warn("Exception when parseObj", msg); - } - return null; - } - - public static JSONArray parseArr(String jsonStr) { - if (StrUtil.isEmpty(jsonStr)) { - return null; - } - - try { - return JSONObject.parseArray(jsonStr); - } catch (Exception e) { - String msg = e.getMessage(); - if (msg != null && msg.length() > 100) { - msg = msg.substring(0, 100); - } - LogUtil.warn("Exception when parseJson", msg); - } - return null; - } - - public static List parseArr(String jsonStr, Class clazz) { - if (StrUtil.isEmpty(jsonStr)) { - return null; - } - - try { - return JSONObject.parseArray(jsonStr, clazz); - } catch (Exception e) { - String msg = e.getMessage(); - if (msg != null && msg.length() > 100) { - msg = msg.substring(0, 100); - } - LogUtil.warn("Exception when parseObj", msg); - } - return null; - } -} diff --git a/HelloAudio/src/main/java/com/hello/util/LogUtil.java b/HelloAudio/src/main/java/com/hello/util/LogUtil.java deleted file mode 100644 index 1875c33..0000000 --- a/HelloAudio/src/main/java/com/hello/util/LogUtil.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.hello.util; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class LogUtil { - private static final Logger log = LoggerFactory.getLogger(LogUtil.class); - - public static void debug(Object... msg) { - debug(log, msg); - } - - public static void debug(Logger log, Object... msg) { - log.debug(StrUtil.joinObj(msg, ", ")); - } - - public static void info(Object... msg) { - info(log, msg); - } - - public static void info(Logger log, Object... msg) { - log.info(StrUtil.joinObj(msg, ", ")); - } - - public static void warn(Object... msg) { - warn(log, msg); - } - - public static void warn(Logger log, Object... msg) { - log.warn(StrUtil.joinObj(msg, ", ")); - } - - public static void error(Object... msg) { - error(log, msg); - } - - public static void error(Logger log, Object... msg) { - log.error(StrUtil.joinObj(msg, ", ")); - } -} diff --git a/HelloAudio/src/main/java/com/hello/util/StrUtil.java b/HelloAudio/src/main/java/com/hello/util/StrUtil.java deleted file mode 100644 index 995bb48..0000000 --- a/HelloAudio/src/main/java/com/hello/util/StrUtil.java +++ /dev/null @@ -1,192 +0,0 @@ -package com.hello.util; - -import org.apache.commons.collections4.CollectionUtils; - -import java.io.UnsupportedEncodingException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class StrUtil { - /** - * String is null or empty - */ - public static boolean isEmpty(String str) { - return isEmpty(str, true); - } - - public static boolean isEmpty(String str, boolean trim) { - return str == null || str.isEmpty() || (trim && str.trim().isEmpty()); - } - - public static boolean chkLen(String str, int minLen, int maxLen) { - return str != null - && str.length() >= Math.max(minLen, 0) - && str.length() <= Math.min(Math.max(maxLen, 0), 1024); - } - - public static String mask(String str) { - return mask(str, 1, 12); - } - - public static String mask(String str, int minLen, int maxLen) { - if (isEmpty(str)) { - return ""; - } - - str = str.trim().replace(" ", "") - .replace("-", "") - .replace("_", ""); - if (str.length() <= minLen && minLen > 0) { - return str; - } - - // Remove the middle part if it's too long - if (maxLen > 0) { - if (maxLen % 2 != 0) { - maxLen++; - } - - if (str.length() > maxLen) { - str = String.format("%s%s", - str.substring(0, maxLen / 2), - str.substring(str.length() - maxLen / 2, str.length()) - ); - } - } - - // Divide 3 parts: str+mask+str - final int len = str.length(); - final int maskLen = len > 3 ? len / 3 : 1; - StringBuilder sb = new StringBuilder(maskLen); - for (int i = 0; i < maskLen; i++) { - sb.append("*"); - } - - int startLen = (len - maskLen) / 2; - return String.format("%s%s%s", - str.substring(0, startLen), sb.toString(), str.substring(startLen + maskLen, len) - ); - } - - public static boolean matches(String str, String pattern) { - if (isEmpty(str) || isEmpty(pattern)) { - return false; - } - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(str); - return m.matches(); - } - - public static String[] parse(String str, String pattern) { - if (isEmpty(str) || isEmpty(pattern)) { - return null; - } - - List list = new ArrayList(); - Pattern p = Pattern.compile(pattern); - Matcher m = p.matcher(str); - while (m.find()) { - list.add(m.group()); - } - if (list.size() <= 0) { - return null; - } - - String[] arr = new String[list.size()]; - list.toArray(arr); - return arr; - } - - public static boolean contains(String str, String subStr) { - return contains(str, subStr, ","); - } - - public static boolean contains(String str, String subStr, String separator) { - if (isEmpty(str) || isEmpty(subStr)) { - return false; - } - - if (subStr.equalsIgnoreCase(str)) { - return true; - } - - String[] strArray = split(str, separator); - if (strArray == null) { - return false; - } - - for (String tmpStr : strArray) { - if (tmpStr.trim().length() == 0 && subStr.trim().length() == 0) { - return true; - } - - if (tmpStr.trim().equalsIgnoreCase(subStr.trim())) { - return true; - } - } - return false; - } - - public static String[] split(String str, String separator) { - if (isEmpty(str) || isEmpty(separator)) { - return null; - } - return str.split(separator); - } - - public static String joinObj(Object[] objArr, String separator) { - return objArr == null ? null : joinObj(Arrays.asList(objArr), separator); - } - - public static String joinObj(Collection objList, String separator) { - if (CollectionUtils.isEmpty(objList)) { - return null; - } - - List strList = new ArrayList(); - for (Object obj : objList) { - strList.add(obj == null ? "" : obj.toString()); - } - return join(strList, separator); - } - - public static String join(String[] strArr, String separator) { - return strArr == null ? null : join(Arrays.asList(strArr), separator); - } - - public static String join(Collection strList, String separator) { - if (CollectionUtils.isEmpty(strList) || separator == null) { - return null; - } - - StringBuilder sb = new StringBuilder(); - for (String str : strList) { - sb.append(separator); - sb.append(str); - } - return sb.substring(separator.length()); - } - - /** - * Get the bytes with UTF-8 - */ - public static byte[] getBytes(String str) { - if (str == null) { - return null; - } - try { - return str.getBytes("UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - return null; - } - - public static String trimChinese(String str) { - return isEmpty(str) ? "" : str.replaceAll("[\u4e00-\u9fa5]+", ""); - } -} From 6b6eceb768aa6d18b243795e2e4aa0974b1d1fd0 Mon Sep 17 00:00:00 2001 From: dingxl Date: Sun, 1 Mar 2020 12:49:06 +0800 Subject: [PATCH 02/20] Java dialog and frame --- .../src/main/java/com/hello/dialog/App.java | 65 +------------------ .../main/java/com/hello/dialog/Dialog.java | 39 +++++++++++ .../src/main/java/com/hello/dialog/Frame.java | 56 ++++++++++++++++ 3 files changed, 98 insertions(+), 62 deletions(-) create mode 100644 HelloDialog/src/main/java/com/hello/dialog/Dialog.java create mode 100644 HelloDialog/src/main/java/com/hello/dialog/Frame.java diff --git a/HelloDialog/src/main/java/com/hello/dialog/App.java b/HelloDialog/src/main/java/com/hello/dialog/App.java index 9965c12..78fa87f 100644 --- a/HelloDialog/src/main/java/com/hello/dialog/App.java +++ b/HelloDialog/src/main/java/com/hello/dialog/App.java @@ -1,9 +1,7 @@ package com.hello.dialog; + import javax.swing.*; -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; /** * Hello dialog! @@ -11,69 +9,12 @@ public class App { public static void main(String[] args) { // create frame - final JFrame frame = new JFrame("Hello Dialog"); + final JFrame frame = new Frame(); + frame.setTitle("Hello App"); frame.setSize(300, 300); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); frame.setResizable(false); - - // create panel - JPanel panel = new JPanel(); - Box verticalBox = Box.createVerticalBox(); - panel.add(verticalBox); - - // Create buttons - verticalBox.add(new JButton("Record") {{ - addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // Record audio - } - }); - }}); - - verticalBox.add(new JButton("About") {{ - addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - showDialog(frame, frame); - } - }); - }}); - - // Show panel - frame.setContentPane(panel); frame.setVisible(true); } - - private static void showDialog(Frame owner, Component parentComponnent) { - // create dialog - final JDialog dialog = new JDialog(owner, "Info", true); - dialog.setSize(250, 150); - dialog.setResizable(false); - dialog.setLocationRelativeTo(parentComponnent); - - // Add list - Box verticalBox = Box.createVerticalBox(); - - // create content - verticalBox.add(new JLabel("Message")); - verticalBox.add(new JButton("OK") {{ - addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - // close dialog - dialog.dispose(); - } - }); - }}); - - // Add to panel - JPanel panel = new JPanel(); - panel.add(verticalBox); - - // Show panel in dialog - dialog.setContentPane(panel); - dialog.setVisible(true); - } } diff --git a/HelloDialog/src/main/java/com/hello/dialog/Dialog.java b/HelloDialog/src/main/java/com/hello/dialog/Dialog.java new file mode 100644 index 0000000..70c7586 --- /dev/null +++ b/HelloDialog/src/main/java/com/hello/dialog/Dialog.java @@ -0,0 +1,39 @@ +package com.hello.dialog; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class Dialog { + public static void showDialog(JFrame owner, Component parentComponnent) { + // create dialog + final JDialog dialog = new JDialog(owner, "Hello Dialog", true); + dialog.setSize(250, 150); + dialog.setResizable(false); + dialog.setLocationRelativeTo(parentComponnent); + + // Add list + Box verticalBox = Box.createVerticalBox(); + + // create content + verticalBox.add(new JLabel("Message")); + verticalBox.add(new JButton("OK") {{ + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + // close dialog + dialog.dispose(); + } + }); + }}); + + // Add to panel + JPanel panel = new JPanel(); + panel.add(verticalBox); + + // Show panel in dialog + dialog.setContentPane(panel); + dialog.setVisible(true); + } +} diff --git a/HelloDialog/src/main/java/com/hello/dialog/Frame.java b/HelloDialog/src/main/java/com/hello/dialog/Frame.java new file mode 100644 index 0000000..1f715e1 --- /dev/null +++ b/HelloDialog/src/main/java/com/hello/dialog/Frame.java @@ -0,0 +1,56 @@ +package com.hello.dialog; + +import javax.swing.*; +import java.awt.*; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; + +public class Frame extends JFrame { + public Frame(){ + this.setTitle("Hello Frame"); + this.setSize(300, 300); + this.setLocation(300, 300); + this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); + this.setLayout(new BorderLayout()); + this.setResizable(false); + this.setVisible(true); + + // create panel + JPanel topPanel = new JPanel(); + topPanel.setLayout(new FlowLayout()); + this.add(topPanel, BorderLayout.NORTH); + + // Create buttons + topPanel.add(new JButton("Btn1")); + topPanel.add(new JButton("Btn2")); + topPanel.add(new JButton("Btn3")); + + // create panel + JPanel bottomPanel = new JPanel(); + bottomPanel.setLayout(new BorderLayout()); + this.add(bottomPanel, BorderLayout.SOUTH); + + // Create buttons + bottomPanel.add(new JButton("Btn4"), BorderLayout.CENTER); + bottomPanel.add(new JButton("Btn5"), BorderLayout.NORTH); + bottomPanel.add(new JButton("Btn6"), BorderLayout.WEST); + bottomPanel.add(new JButton("Btn7"), BorderLayout.EAST); + + // create panel + JPanel centerPanel = new JPanel(); + Box verticalBox = Box.createVerticalBox(); + centerPanel.add(verticalBox); + this.add(centerPanel, BorderLayout.CENTER); + + // Create buttons + final JFrame frame = this; + verticalBox.add(new JButton("About") {{ + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + Dialog.showDialog(frame, frame); + } + }); + }}); + } +} From 31f71ec38a2b788e5ff4c82e27d49ce7009669ca Mon Sep 17 00:00:00 2001 From: dingxl Date: Sun, 1 Mar 2020 13:08:45 +0800 Subject: [PATCH 03/20] Add TextArea --- .../src/main/java/com/hello/dialog/Frame.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/HelloDialog/src/main/java/com/hello/dialog/Frame.java b/HelloDialog/src/main/java/com/hello/dialog/Frame.java index 1f715e1..3c548e0 100644 --- a/HelloDialog/src/main/java/com/hello/dialog/Frame.java +++ b/HelloDialog/src/main/java/com/hello/dialog/Frame.java @@ -4,6 +4,7 @@ import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.Date; public class Frame extends JFrame { public Frame(){ @@ -31,19 +32,33 @@ public Frame(){ this.add(bottomPanel, BorderLayout.SOUTH); // Create buttons - bottomPanel.add(new JButton("Btn4"), BorderLayout.CENTER); - bottomPanel.add(new JButton("Btn5"), BorderLayout.NORTH); + bottomPanel.add(new JButton("Btn4"), BorderLayout.NORTH); + bottomPanel.add(new JButton("Btn5"), BorderLayout.CENTER); bottomPanel.add(new JButton("Btn6"), BorderLayout.WEST); bottomPanel.add(new JButton("Btn7"), BorderLayout.EAST); // create panel JPanel centerPanel = new JPanel(); - Box verticalBox = Box.createVerticalBox(); - centerPanel.add(verticalBox); + centerPanel.setLayout(new BorderLayout()); this.add(centerPanel, BorderLayout.CENTER); + Box verticalBox = Box.createVerticalBox(); + centerPanel.add(verticalBox, BorderLayout.CENTER); + + final JTextArea textArea = new JTextArea(); + textArea.setEditable(false); + // Create buttons final JFrame frame = this; + verticalBox.add(new JButton("Edit") {{ + addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent e) { + textArea.insert(String.format("Edit %d: %s\n", textArea.getLineCount(), new Date().toString()), 0); + } + }); + }}, BorderLayout.NORTH); + verticalBox.add(new JButton("About") {{ addActionListener(new ActionListener() { @Override @@ -51,6 +66,8 @@ public void actionPerformed(ActionEvent e) { Dialog.showDialog(frame, frame); } }); - }}); + }}, BorderLayout.NORTH); + + verticalBox.add(textArea, BorderLayout.SOUTH); } } From 6a179c41516af5a2850f1d3fd2674f86e1027759 Mon Sep 17 00:00:00 2001 From: dingxl Date: Wed, 11 Mar 2020 16:40:51 +0800 Subject: [PATCH 04/20] Hello ftp --- HelloFtp/pom.xml | 67 ++++++++++++++ HelloFtp/readme.md | 7 ++ HelloFtp/src/main/java/com/hello/ftp/App.java | 17 ++++ .../src/main/java/com/hello/ftp/FtpUtil.java | 92 +++++++++++++++++++ .../src/test/java/com/hello/ftp/AppTest.java | 15 +++ .../test/java/com/hello/ftp/FtpUtilTest.java | 25 +++++ pom.xml | 1 + 7 files changed, 224 insertions(+) create mode 100644 HelloFtp/pom.xml create mode 100644 HelloFtp/readme.md create mode 100644 HelloFtp/src/main/java/com/hello/ftp/App.java create mode 100644 HelloFtp/src/main/java/com/hello/ftp/FtpUtil.java create mode 100644 HelloFtp/src/test/java/com/hello/ftp/AppTest.java create mode 100644 HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java diff --git a/HelloFtp/pom.xml b/HelloFtp/pom.xml new file mode 100644 index 0000000..5d2a794 --- /dev/null +++ b/HelloFtp/pom.xml @@ -0,0 +1,67 @@ + + + + 4.0.0 + + com.hello + ftp + 1.0-SNAPSHOT + + ftp + https://github.com/jextop/ + + + UTF-8 + 1.7 + 1.7 + + + + + junit + junit + 4.11 + test + + + commons-net + commons-net + 3.6 + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 2.4.1 + + + package + + shade + + + + + com.hello.ftp.App + + + META-INF/spring.handlers + + + META-INF/spring.schemas + + + + + + + + + diff --git a/HelloFtp/readme.md b/HelloFtp/readme.md new file mode 100644 index 0000000..7d986f9 --- /dev/null +++ b/HelloFtp/readme.md @@ -0,0 +1,7 @@ +# ftp +https://github.com/rickding/HelloDocker/tree/master/ftp + +docker run -d -v /home/vsftpd:/home/vsftpd -p 20:20 -p 21:21 -p 21100-21110:21100-21110 -e FTP_USER=test -e FTP_PASS=test --name vsftpd fauria/vsftpd + +# client +https://github.com/rickding/HelloJava/tree/master/HelloFtp diff --git a/HelloFtp/src/main/java/com/hello/ftp/App.java b/HelloFtp/src/main/java/com/hello/ftp/App.java new file mode 100644 index 0000000..919fc2a --- /dev/null +++ b/HelloFtp/src/main/java/com/hello/ftp/App.java @@ -0,0 +1,17 @@ +package com.hello.ftp; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; + +public class App { + public static void main(String[] args) throws IOException { + String filePath = "readme.md"; + InputStream fileStream = new FileInputStream(new File(filePath)); + + FtpUtil.upload("app-main", String.format("%d_%s", new Date().getHours(), filePath), fileStream); + fileStream.close(); + } +} diff --git a/HelloFtp/src/main/java/com/hello/ftp/FtpUtil.java b/HelloFtp/src/main/java/com/hello/ftp/FtpUtil.java new file mode 100644 index 0000000..02fdd60 --- /dev/null +++ b/HelloFtp/src/main/java/com/hello/ftp/FtpUtil.java @@ -0,0 +1,92 @@ +package com.hello.ftp; + +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPReply; + +import java.io.IOException; +import java.io.InputStream; + +public class FtpUtil { + private static FTPClient ftpClient = null; + + private static FTPClient getInst() { + if (ftpClient == null) { + synchronized (FtpUtil.class) { + if (ftpClient == null) { + ftpClient = connect("127.0.0.1", 21, "test", "test"); + } + } + } + + return ftpClient; + } + + private static FTPClient connect(String host, int port, String username, String pwd) { + FTPClient ftpClient = new FTPClient(); + ftpClient.setControlEncoding("utf-8"); + ftpClient.setDataTimeout(1000 * 120); + + // 取消服务器获取自身Ip地址和提交的host进行匹配,否则当不一致时会报异常。 + ftpClient.setRemoteVerificationEnabled(false); + + String status = null; + try { + ftpClient.connect(host, port); + ftpClient.login(username, pwd); + status = ftpClient.getStatus(); + } catch (IOException e) { + System.err.printf("Fail to connect: %s, %d, %s, %s, %s\n", host, port, username, pwd, e.getMessage()); + return null; + } + + int replyCode = ftpClient.getReplyCode(); + System.out.printf("Connect: %s, %d, %s, %s, %d, %s\n", host, port, username, pwd, replyCode, status); + if (!FTPReply.isPositiveCompletion(replyCode)) { + return null; + } + + System.out.printf("本地主机: %s, %d\n", ftpClient.getLocalAddress(), ftpClient.getLocalPort()); + System.out.printf("被动模式主机: %s, %d\n", ftpClient.getPassiveHost(), ftpClient.getPassivePort()); + System.out.printf("主动模式主机: %s, %d\n", ftpClient.getRemoteAddress(), ftpClient.getRemotePort()); + return ftpClient; + } + + public static void close() { + if (ftpClient != null) { + synchronized (FtpUtil.class) { + if (ftpClient != null) { + try { + ftpClient.logout(); + ftpClient.disconnect(); + } catch (IOException e) { + System.err.printf("Fail to close: %s\n", e.getMessage()); + } + } + ftpClient = null; + } + } + } + + public static boolean upload(String pathname, String fileName, InputStream inputStream) { + System.out.printf("Start upload: %s\n", fileName); + FTPClient ftpClient = getInst(); + + // 设置被动模式(FTP客户端在docker容器内,需用被动模式) + ftpClient.enterLocalPassiveMode(); + + try { + // 设置传输的模式为二进制文件类型传输和工作路径 + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); + ftpClient.makeDirectory(pathname); + ftpClient.changeWorkingDirectory(pathname); + + ftpClient.storeFile(fileName, inputStream); + } catch (IOException e) { + System.err.printf("Fail to upload: %s, %s\n", fileName, e.getMessage()); + return false; + } + + System.out.printf("Success upload: %s\n", fileName); + return true; + } +} \ No newline at end of file diff --git a/HelloFtp/src/test/java/com/hello/ftp/AppTest.java b/HelloFtp/src/test/java/com/hello/ftp/AppTest.java new file mode 100644 index 0000000..9f64866 --- /dev/null +++ b/HelloFtp/src/test/java/com/hello/ftp/AppTest.java @@ -0,0 +1,15 @@ +package com.hello.ftp; + +import org.junit.Test; + +import static org.junit.Assert.assertTrue; + +/** + * Unit test for simple App. + */ +public class AppTest { + @Test + public void shouldAnswerWithTrue() { + assertTrue(true); + } +} diff --git a/HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java b/HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java new file mode 100644 index 0000000..b928d15 --- /dev/null +++ b/HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java @@ -0,0 +1,25 @@ +package com.hello.ftp; + +import org.junit.Assert; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Date; + +public class FtpUtilTest { + @Test + public void testUpload() throws IOException { + String filePath = "readme.md"; + InputStream fileStream = new FileInputStream(new File(filePath)); + + boolean ret = FtpUtil.upload("unit-testing", String.format("%d_%s", new Date().getHours(), filePath), fileStream); + + fileStream.close(); + FtpUtil.close(); + + Assert.assertTrue(ret); + } +} diff --git a/pom.xml b/pom.xml index e91b708..e34ba7e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,6 +21,7 @@ HelloCodeM HelloDialog HelloFlyway + HelloFtp HelloHack HelloHackerRank HelloHessian From d00051a82d5b593c11ed49f95800fc0769cd7664 Mon Sep 17 00:00:00 2001 From: dingxl Date: Wed, 11 Mar 2020 20:25:42 +0800 Subject: [PATCH 05/20] update --- HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java | 1 - 1 file changed, 1 deletion(-) diff --git a/HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java b/HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java index b928d15..a76f1ec 100644 --- a/HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java +++ b/HelloFtp/src/test/java/com/hello/ftp/FtpUtilTest.java @@ -16,7 +16,6 @@ public void testUpload() throws IOException { InputStream fileStream = new FileInputStream(new File(filePath)); boolean ret = FtpUtil.upload("unit-testing", String.format("%d_%s", new Date().getHours(), filePath), fileStream); - fileStream.close(); FtpUtil.close(); From aae7ba9a90aac2d3afcb929d5d12b13f4d325f20 Mon Sep 17 00:00:00 2001 From: dingxl Date: Thu, 12 Mar 2020 10:51:28 +0800 Subject: [PATCH 06/20] remove unsed file --- HelloAnnotation/db.sqlite3 | Bin 139264 -> 0 bytes .../hello_annotation.postman_collection.json | 0 2 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 HelloAnnotation/db.sqlite3 rename HelloAnnotation/{ => postman}/hello_annotation.postman_collection.json (100%) diff --git a/HelloAnnotation/db.sqlite3 b/HelloAnnotation/db.sqlite3 deleted file mode 100644 index 518cec9a1dbf6569bbee4adccb01d23c2b6e0954..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139264 zcmeI)TZ|jk83*v0^?JQG?*x{`ge9yomt+gOnKSoUiqt^1C?X^T0tHoQn6<~7A>Q@I z_HrreL)I-+LKTm#)T*lJV_$ga8|p(5FYOzZD%47qsF12sscMBpktkLAo$-vvW6!2> zN()Z^&f4ppbH4e`{LYy(XS_)sJ9E-+dBtkIvE{aks&GIMMd2&Oq96#z=~)V&V}c<5 zo!*brGkS>8o6CGZF0A~sk);Zv^a-!F*!gyu2oym80uX=z1Rwwb2tWV=5P$##An@4= z+`RWhp7vOr{7{hIk-jHAE!{r%!Q9X1+H)u7r2KF4KghdzZT8dIw`O0RJu_RF`TfjK zX8f6>(;rR0Iel^Z!Rh?e@1}k{Rh_zrc7O*2AOHafKmY;|_`(WU#jJ4My~ipWvaBkO zyW6Teip*?Tm6^ksrtlwDWOYSmMOj_b)HP$~}=xl^tekb|;eYNZDS~=*wKSRozw<>rgjRv3nz#?l4UY zbFvkt7iD8jQ`VTWYAJ?d*z6XHTnUa-v7G1XyXA9U!>R8yqhvfpU6W1vTD2|9G)!wT zPG%;Osnkp+_eC0O3QuOsvSr;IM;g76vO&!x=zylvOv>4bWERO;2jfURj+AYM4v@-I zBV|%mtefIUtv8ZUYgu|u(_+lhtwJ2BCL$F&PMMm;J2Kf?(@<2)wr-3g#E>xMY8XYd4(vaO{G8HT}h)0*!_vYx>cMW(ja z&^6U$*7b3u)hiU7Bx+*VMg3`LmS!2&b#Y|R7?LfOPA?iMsmH0x3S;^KiqwMv%M7RL zmc5o!^=qEfdU3}~4Wpgf%#z}Sy#vVN=N2_IEmF5NRg;Z5iZnY3weA_xN$gir<4i?W z*xh-GyR8$ab{d*mS+gu=S+jBTdPj_{SdTOMqsx)cL#F4!t#!@tXP8q3@%%-#7 znvNrTM~tQLGeb)!q4`T;)>JoAww;RGa{1(FQMd6?s-=!nO;c@Iw=HjmMF_^NdBKlqu=6qH0<;oe!BfvUi>dB4s_*MAbE!&ZDt7GBIlS zv~MP-{pkEtRa4dM6_FzE?3gge-}YO+TT4ASn$J|m@Bb&HH>RWyq+dyINbgE-O7BVU zePJ)&Xcz<_009U<00Izz00bZa0SG|gS`?6uXJ*$kOOwIpU{1YO$*pA;Ciy2Ff-wEn z%;IGDxh@@h&ZZLjIQtxT$bC68FV^at+1!J)l}9g#nWJLmS$BK0?riy+4Y%djx0}Uj zUi$!l!2<#ifB*y_009U<00Izz00bZafooNO-~VT&KMB&O(#O(=(qHH;9uR;41Rwwb z2tWV=5P$##AOHafjHtkPMi8_7Wt_ic_{&%(BTV7<|0CL=Xf^~O009U<00Izz00bZa z0SG`~2m##x4}pcM5P$##AOHafKmY;|fB*y_0D%z|!2SP-b{v`w0SG_<0uX=z1Rwwb z2tWV=5Ew!L_y0p+p(+F*009U<00Izz00bZa0SG`~LN)Uhm1Rwwb2tWV=5P$##AOL}p7U2K>KPxQ= z(mT@YQd2rkZ}ETt1Rwwb2tWV=5P$##AOHaf{C^0nWTymS=@=cXSUz{&scftjHAQCj zima~4tSGB%n!2W%tD3Iss(fi>e4x78SDmeC#;VD5T{bVRWCp4$Y1I|mwwZBhWo)22 z8?3Icnue?yR9zgXE)P~$S5;dvE%_4v{eM<^Uy%MGeI)%=`hecz0Rad=00Izz00bZa z0SG_<0uX?}=m}&qqIfAAyp9L2nc#J7JR?qB!vFt2dL4=uLjVF0fB*y_009U<00Izz z00f2=z`y?=Rt)ta009U<00Izz00bZa0SG_<0;4B@`~T7FGqe~25P$##AOHafKmY;| zfB*y_FsuOX|A!SreF#7R0uX=z1Rwwb2tWV=5P-nw3E=*J^!f}fh5!U0009U<00Izz z00bZa0SF8$fcyVp#ZVst5P$##AOHafKmY;|fB*y_FnR*{$!CPw?AwBL$K0=H4ov@X zt~!^Q_+|dL`K|o)?2oc<$A5&i>EhJSrq1NPKXnT~&fJCZn@8_>(P9Wd;J+;}VfAOo z9Pi(9nV%=uGP|AP+1E0^xJ*S9ae+N??}=PteqL<*Eq9~l)#{t{b^Qa6t{*$QUOap3 z{*&v)5^X6JkCgmMspxOFyiKoBJazhP@zmodPZl3}^u)u*9(}6#(E3xwV~?Lbec}|w zKD>VF>^;R&ut#Ux-SSGs=iEm5oZC2JXv;w$6*qUcw%o>xrDDr_p%rZ`H$1oHQKkxg zYx!GVUxBkh0UQ1%H6$wWcT#un?zYZ3yv@nl^_^y^*xYh!wP+X1?fJdaxx&JN`0`ZH z7a$Jd`MmiDV!DxN;oDdpW4@2j-@%-*B9 zf=Ri=I2Z3`y8Jk*VHj@34iZTziTdj$vxKFkWqb{j;tHkZN5&=!ci$~`PT%lUZ+aJYz3sBs_hTl^ z)mb9-6&~SN{Cg;J`QlSzu5k3IxaS5_LgiU^d$aCr`I`-wU(lNa8^#j*Ee(`k)yzSY zLp(7kx*jh;Xy!<+PWnqJwB{#Q2GI$ZAOE3no$$UOy)Hc>ygy!>`@`JsoRI%cK0o`@ ziH9dwvma+)%^n$lYxe%h)ydVKQ*(6QzLIS(<_e38;&(g!_gsCqe9mix-wq}FD%^T? zJ=B>k`WLI^dZlO8r0})#z?9x>xvky)H7)h)ZlmT@-Lmi2di&mpcM;Yp(^7cDEuZhN z)mdcny=+k{26oaZ<|}mPdDn0G+jNi6zh)0gcN*S~+qhhLozAZ2{uQeJw%E$_sn+@h_tZ<#0@TikCI7M^+z3*X!}`J`|cU$tGF3a-di8YE8e(t2^n zb67=Xwpo?S?IXE@O|`Odty;YtOwEp4arKQ##pYp!;AtgzFy=0EClrEC(yLvB@L5ldo=2V#MYNo32?FUk_q*P5N ziYt_sA8X$^Q8>CFUWm=MD!QX6Y{SqLi|3e0$r z^VV=z;YSgC(^XBd$(c0$9=!ibn4BwlGrL1P7{%dK+?hv{L%0VlF*WUT7DgS}_gTgN z=1#s+e}21GcPsmxMT3hDZtRo7eUz*aCyNJaVwMPk zhn_0BDdWBJLmc~7;pme1Qk=ARF6bWJl}{SoG{MY4`@f^GzO>(^p}T)47+sxMK@k6z zD=aOEuN>~qHbF_Zc5!gt>82g}gHTL9ozEBhKSr#!m+1umcUNiNC&QlGeW$h4E=?5l zMe&=#7>rg6w9ar`)80@my&7)2B{_$r)$B|lVF}N}mn+LJv~SB5))&Q#hY~61MCh)t zjIyjU%~HeA>GV`-5d$fEDwURZ+r?br0ZM(aKXtgsb!<&5S1L-Bd1~Lx{Q+r-qm}b= zqrH^lYqE$Xo3^ihTGnu#Pb-~UX~h5D$3RQ2r0@H&CjwftL}zkhubI8ll9jg$kv^nPwzcB zQCOK5w*pT3rHjJ{sIIz(S1~mDc|Mt;zeZ=z;V)}~LHYH)uhFod4~IRkAGM~UF Date: Fri, 13 Mar 2020 17:08:29 +0800 Subject: [PATCH 07/20] update quartz --- HelloQuartz/pom.xml | 5 ----- HelloQuartz/src/main/java/com/hello/quartz/QuartzJob.java | 6 ++---- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/HelloQuartz/pom.xml b/HelloQuartz/pom.xml index 0010d37..85468c6 100644 --- a/HelloQuartz/pom.xml +++ b/HelloQuartz/pom.xml @@ -27,11 +27,6 @@ org.springframework.boot spring-boot-starter-quartz - - org.apache.httpcomponents - httpclient - 4.5.2 - org.springframework.boot diff --git a/HelloQuartz/src/main/java/com/hello/quartz/QuartzJob.java b/HelloQuartz/src/main/java/com/hello/quartz/QuartzJob.java index 4dab995..42659c7 100644 --- a/HelloQuartz/src/main/java/com/hello/quartz/QuartzJob.java +++ b/HelloQuartz/src/main/java/com/hello/quartz/QuartzJob.java @@ -11,14 +11,12 @@ public class QuartzJob extends QuartzJobBean { @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { - // System.out.printf("quartz cron: %s\n", new Date()); + System.out.printf("quartz cron: %s\n", new Date()); // get data from context JobDataMap dataMap = context.getMergedJobDataMap(); for (Map.Entry data : dataMap.entrySet()) { - // System.out.printf("%s = %s\n", data.getKey(), data.getValue()); + System.out.printf("%s = %s\n", data.getKey(), data.getValue()); } - - // do work } } From 780bbba0005184d69293af1a0b3220c3b9316845 Mon Sep 17 00:00:00 2001 From: dingxl Date: Fri, 13 Mar 2020 17:18:07 +0800 Subject: [PATCH 08/20] rename variable --- HelloQuartz/src/main/java/com/hello/quartz/QuartzConfig.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/HelloQuartz/src/main/java/com/hello/quartz/QuartzConfig.java b/HelloQuartz/src/main/java/com/hello/quartz/QuartzConfig.java index d1bac11..1558c65 100644 --- a/HelloQuartz/src/main/java/com/hello/quartz/QuartzConfig.java +++ b/HelloQuartz/src/main/java/com/hello/quartz/QuartzConfig.java @@ -29,14 +29,14 @@ public JobDetail quartzJob() { @Bean public Trigger quartzTrigger() { - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + CronScheduleBuilder schedule = CronScheduleBuilder.cronSchedule(cron); JobDataMap dataMap = new JobDataMap() {{ put("trigger_int", 333); }}; return TriggerBuilder.newTrigger() .forJob(quartzJob()) - .withSchedule(scheduleBuilder) + .withSchedule(schedule) .usingJobData(dataMap) .build(); } From b325d65023e54d956ad529f41aa0a250731d94c2 Mon Sep 17 00:00:00 2001 From: dingxl Date: Mon, 16 Mar 2020 20:05:51 +0800 Subject: [PATCH 09/20] Add HelloHtml with freemarker --- HelloHtml/.gitignore | 31 ++ .../.mvn/wrapper/MavenWrapperDownloader.java | 117 +++++++ HelloHtml/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + HelloHtml/mvnw | 310 ++++++++++++++++++ HelloHtml/mvnw.cmd | 182 ++++++++++ HelloHtml/pom.xml | 53 +++ .../java/com/hello/html/HtmlApplication.java | 12 + .../java/com/hello/html/HtmlController.java | 14 + .../src/main/resources/application.properties | 1 + .../src/main/resources/templates/index.ftl | 10 + HelloSocket/.gitignore | 31 ++ .../.mvn/wrapper/MavenWrapperDownloader.java | 117 +++++++ HelloSocket/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + HelloSocket/mvnw | 310 ++++++++++++++++++ HelloSocket/mvnw.cmd | 182 ++++++++++ HelloSocket/pom.xml | 63 ++++ .../java/com/hello/SocketApplication.java | 13 + .../hello/controller/SocketController.java | 20 ++ .../java/com/hello/socket/SocketConfig.java | 13 + .../java/com/hello/socket/SocketServer.java | 67 ++++ .../src/main/resources/application.properties | 1 + .../src/main/resources/templates/index.ftl | 10 + .../src/main/resources/templates/socket.ftl | 72 ++++ pom.xml | 2 + 26 files changed, 1635 insertions(+) create mode 100644 HelloHtml/.gitignore create mode 100644 HelloHtml/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 HelloHtml/.mvn/wrapper/maven-wrapper.jar create mode 100644 HelloHtml/.mvn/wrapper/maven-wrapper.properties create mode 100644 HelloHtml/mvnw create mode 100644 HelloHtml/mvnw.cmd create mode 100644 HelloHtml/pom.xml create mode 100644 HelloHtml/src/main/java/com/hello/html/HtmlApplication.java create mode 100644 HelloHtml/src/main/java/com/hello/html/HtmlController.java create mode 100644 HelloHtml/src/main/resources/application.properties create mode 100644 HelloHtml/src/main/resources/templates/index.ftl create mode 100644 HelloSocket/.gitignore create mode 100644 HelloSocket/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 HelloSocket/.mvn/wrapper/maven-wrapper.jar create mode 100644 HelloSocket/.mvn/wrapper/maven-wrapper.properties create mode 100644 HelloSocket/mvnw create mode 100644 HelloSocket/mvnw.cmd create mode 100644 HelloSocket/pom.xml create mode 100644 HelloSocket/src/main/java/com/hello/SocketApplication.java create mode 100644 HelloSocket/src/main/java/com/hello/controller/SocketController.java create mode 100644 HelloSocket/src/main/java/com/hello/socket/SocketConfig.java create mode 100644 HelloSocket/src/main/java/com/hello/socket/SocketServer.java create mode 100644 HelloSocket/src/main/resources/application.properties create mode 100644 HelloSocket/src/main/resources/templates/index.ftl create mode 100644 HelloSocket/src/main/resources/templates/socket.ftl diff --git a/HelloHtml/.gitignore b/HelloHtml/.gitignore new file mode 100644 index 0000000..a2a3040 --- /dev/null +++ b/HelloHtml/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/HelloHtml/.mvn/wrapper/MavenWrapperDownloader.java b/HelloHtml/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..e76d1f3 --- /dev/null +++ b/HelloHtml/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/HelloHtml/.mvn/wrapper/maven-wrapper.jar b/HelloHtml/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/HelloHtml/.mvn/wrapper/maven-wrapper.properties b/HelloHtml/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..642d572 --- /dev/null +++ b/HelloHtml/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/HelloHtml/mvnw b/HelloHtml/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/HelloHtml/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/HelloHtml/mvnw.cmd b/HelloHtml/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/HelloHtml/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/HelloHtml/pom.xml b/HelloHtml/pom.xml new file mode 100644 index 0000000..014ba75 --- /dev/null +++ b/HelloHtml/pom.xml @@ -0,0 +1,53 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.6.RELEASE + + + com.hello + html + 0.0.1-SNAPSHOT + html + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-freemarker + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/HelloHtml/src/main/java/com/hello/html/HtmlApplication.java b/HelloHtml/src/main/java/com/hello/html/HtmlApplication.java new file mode 100644 index 0000000..5c64429 --- /dev/null +++ b/HelloHtml/src/main/java/com/hello/html/HtmlApplication.java @@ -0,0 +1,12 @@ +package com.hello.html; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class HtmlApplication { + public static void main(String[] args) { + SpringApplication.run(HtmlApplication.class, args); + } +} diff --git a/HelloHtml/src/main/java/com/hello/html/HtmlController.java b/HelloHtml/src/main/java/com/hello/html/HtmlController.java new file mode 100644 index 0000000..22ca60b --- /dev/null +++ b/HelloHtml/src/main/java/com/hello/html/HtmlController.java @@ -0,0 +1,14 @@ +package com.hello.html; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class HtmlController { + @RequestMapping + public String index(Model model){ + model.addAttribute("msg","Hello Html!"); + return "index"; + } +} diff --git a/HelloHtml/src/main/resources/application.properties b/HelloHtml/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/HelloHtml/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/HelloHtml/src/main/resources/templates/index.ftl b/HelloHtml/src/main/resources/templates/index.ftl new file mode 100644 index 0000000..c11c24d --- /dev/null +++ b/HelloHtml/src/main/resources/templates/index.ftl @@ -0,0 +1,10 @@ + + + + + Title + + +Hello World! ${msg} + + diff --git a/HelloSocket/.gitignore b/HelloSocket/.gitignore new file mode 100644 index 0000000..a2a3040 --- /dev/null +++ b/HelloSocket/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/HelloSocket/.mvn/wrapper/MavenWrapperDownloader.java b/HelloSocket/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..e76d1f3 --- /dev/null +++ b/HelloSocket/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/HelloSocket/.mvn/wrapper/maven-wrapper.jar b/HelloSocket/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/HelloSocket/.mvn/wrapper/maven-wrapper.properties b/HelloSocket/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..642d572 --- /dev/null +++ b/HelloSocket/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/HelloSocket/mvnw b/HelloSocket/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/HelloSocket/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/HelloSocket/mvnw.cmd b/HelloSocket/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/HelloSocket/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/HelloSocket/pom.xml b/HelloSocket/pom.xml new file mode 100644 index 0000000..f8fd771 --- /dev/null +++ b/HelloSocket/pom.xml @@ -0,0 +1,63 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.6.RELEASE + + + com.hello + socket + 0.0.1-SNAPSHOT + socket + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-websocket + + + org.apache.commons + commons-lang3 + 3.7 + + + + org.springframework.boot + spring-boot-starter-freemarker + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/HelloSocket/src/main/java/com/hello/SocketApplication.java b/HelloSocket/src/main/java/com/hello/SocketApplication.java new file mode 100644 index 0000000..35c81d3 --- /dev/null +++ b/HelloSocket/src/main/java/com/hello/SocketApplication.java @@ -0,0 +1,13 @@ +package com.hello; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@EnableAutoConfiguration +@SpringBootApplication +public class SocketApplication { + public static void main(String[] args) { + SpringApplication.run(SocketApplication.class, args); + } +} diff --git a/HelloSocket/src/main/java/com/hello/controller/SocketController.java b/HelloSocket/src/main/java/com/hello/controller/SocketController.java new file mode 100644 index 0000000..73c7776 --- /dev/null +++ b/HelloSocket/src/main/java/com/hello/controller/SocketController.java @@ -0,0 +1,20 @@ +package com.hello.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; + +@Controller +public class SocketController { + @RequestMapping + public String index(Model model){ + model.addAttribute("msg","Hello Socket!"); + return "index"; + } + + @RequestMapping("/ws") + public String ws(Model model){ + model.addAttribute("msg","Socket!"); + return "socket"; + } +} diff --git a/HelloSocket/src/main/java/com/hello/socket/SocketConfig.java b/HelloSocket/src/main/java/com/hello/socket/SocketConfig.java new file mode 100644 index 0000000..46b6bd9 --- /dev/null +++ b/HelloSocket/src/main/java/com/hello/socket/SocketConfig.java @@ -0,0 +1,13 @@ +package com.hello.socket; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.server.standard.ServerEndpointExporter; + +@Configuration +public class SocketConfig { + @Bean + public ServerEndpointExporter serverEndpointExporter() { + return new ServerEndpointExporter(); + } +} diff --git a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java new file mode 100644 index 0000000..fefed9e --- /dev/null +++ b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java @@ -0,0 +1,67 @@ +package com.hello.socket; + +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import javax.websocket.OnClose; +import javax.websocket.OnError; +import javax.websocket.OnMessage; +import javax.websocket.OnOpen; +import javax.websocket.Session; +import javax.websocket.server.PathParam; +import javax.websocket.server.ServerEndpoint; +import java.io.IOException; +import java.util.concurrent.ConcurrentHashMap; + +@ServerEndpoint("/ws/{uid}") +@Component +public class SocketServer { + private static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); + + private Session session; + private String userId; + + public static void sendMessage(String userId, String message) { + System.out.printf("Send message: %s, %s", userId, message); + if (StringUtils.isNotBlank(userId) && webSocketMap.containsKey(userId)) { + webSocketMap.get(userId).sendMessage(message); + } else { + System.err.printf("Offline: %s\n", userId); + } + } + + private void sendMessage(String message) { + try { + session.getBasicRemote().sendText(message); + } catch (IOException e) { + System.err.println(e.getMessage()); + } + } + + @OnMessage + public void onMessage(String message, Session session) { + System.out.printf("Receive message: %s, %s\n", userId, message); + sendMessage(String.format("转发消息: %s", message)); + } + + @OnOpen + public void onOpen(Session session, @PathParam("uid") String userId) { + this.session = session; + this.userId = userId; + + webSocketMap.put(userId, this); + System.out.printf("Online: %d, %s\n", webSocketMap.size(), userId); + sendMessage("连接成功"); + } + + @OnClose + public void onClose() { + webSocketMap.remove(userId); + System.out.printf("Offline: %d, %s\n", webSocketMap.size(), userId); + } + + @OnError + public void onError(Session session, Throwable error) { + System.err.printf("Error: %s, %s\n", userId, error.getMessage()); + } +} diff --git a/HelloSocket/src/main/resources/application.properties b/HelloSocket/src/main/resources/application.properties new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/HelloSocket/src/main/resources/application.properties @@ -0,0 +1 @@ + diff --git a/HelloSocket/src/main/resources/templates/index.ftl b/HelloSocket/src/main/resources/templates/index.ftl new file mode 100644 index 0000000..c11c24d --- /dev/null +++ b/HelloSocket/src/main/resources/templates/index.ftl @@ -0,0 +1,10 @@ + + + + + Title + + +Hello World! ${msg} + + diff --git a/HelloSocket/src/main/resources/templates/socket.ftl b/HelloSocket/src/main/resources/templates/socket.ftl new file mode 100644 index 0000000..92745a7 --- /dev/null +++ b/HelloSocket/src/main/resources/templates/socket.ftl @@ -0,0 +1,72 @@ + + + + + HelloSocket + + + + + + +
uid: +
+
msg: +
+ +
+
+ +
+
+
+ +
+ +
+
+ + + \ No newline at end of file diff --git a/pom.xml b/pom.xml index e34ba7e..fd38d30 100644 --- a/pom.xml +++ b/pom.xml @@ -25,6 +25,7 @@ HelloHack HelloHackerRank HelloHessian + HelloHtml HelloHttp HelloJpa HelloJUnit @@ -34,6 +35,7 @@ HelloRedis HelloRunner HelloSingleton + HelloSocket HelloThread HelloWar HelloWeb From 9756f5026906a54cd18d1becdbb2e919ee5a89c0 Mon Sep 17 00:00:00 2001 From: dingxl Date: Mon, 16 Mar 2020 21:09:35 +0800 Subject: [PATCH 10/20] Hello Socket --- HelloSocket/src/main/java/com/hello/socket/SocketServer.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java index fefed9e..9a49263 100644 --- a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java +++ b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java @@ -41,7 +41,10 @@ private void sendMessage(String message) { @OnMessage public void onMessage(String message, Session session) { System.out.printf("Receive message: %s, %s\n", userId, message); - sendMessage(String.format("转发消息: %s", message)); + + for (String userId : webSocketMap.keySet()) { + sendMessage(userId, String.format("%s消息: %s", userId.equals(this.userId) ? "自己" : "转发", message)); + } } @OnOpen From 4c83b46bef4f4acfa609182ce7a151edf139309d Mon Sep 17 00:00:00 2001 From: dingxl Date: Mon, 16 Mar 2020 21:27:23 +0800 Subject: [PATCH 11/20] add tio WebSocket --- HelloSocket/pom.xml | 11 ++- .../java/com/hello/SocketApplication.java | 2 + .../hello/controller/SocketController.java | 8 +- .../java/com/hello/socket/TioMsgHandler.java | 39 ++++++++++ .../src/main/resources/application.properties | 1 - .../src/main/resources/application.yml | 4 + .../src/main/resources/templates/socket.ftl | 2 + .../src/main/resources/templates/tio.ftl | 74 +++++++++++++++++++ 8 files changed, 138 insertions(+), 3 deletions(-) create mode 100644 HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java delete mode 100644 HelloSocket/src/main/resources/application.properties create mode 100644 HelloSocket/src/main/resources/application.yml create mode 100644 HelloSocket/src/main/resources/templates/tio.ftl diff --git a/HelloSocket/pom.xml b/HelloSocket/pom.xml index f8fd771..9cc455c 100644 --- a/HelloSocket/pom.xml +++ b/HelloSocket/pom.xml @@ -23,16 +23,25 @@ org.springframework.boot spring-boot-starter-web
+ + org.springframework.boot spring-boot-starter-websocket + + + + org.t-io + tio-websocket-spring-boot-starter + 3.5.5.v20191010-RELEASE + + org.apache.commons commons-lang3 3.7 - org.springframework.boot spring-boot-starter-freemarker diff --git a/HelloSocket/src/main/java/com/hello/SocketApplication.java b/HelloSocket/src/main/java/com/hello/SocketApplication.java index 35c81d3..31c4884 100644 --- a/HelloSocket/src/main/java/com/hello/SocketApplication.java +++ b/HelloSocket/src/main/java/com/hello/SocketApplication.java @@ -3,7 +3,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.tio.websocket.starter.EnableTioWebSocketServer; +@EnableTioWebSocketServer @EnableAutoConfiguration @SpringBootApplication public class SocketApplication { diff --git a/HelloSocket/src/main/java/com/hello/controller/SocketController.java b/HelloSocket/src/main/java/com/hello/controller/SocketController.java index 73c7776..011b3b3 100644 --- a/HelloSocket/src/main/java/com/hello/controller/SocketController.java +++ b/HelloSocket/src/main/java/com/hello/controller/SocketController.java @@ -14,7 +14,13 @@ public String index(Model model){ @RequestMapping("/ws") public String ws(Model model){ - model.addAttribute("msg","Socket!"); + model.addAttribute("msg","Web Socket!"); return "socket"; } + + @RequestMapping("/tio") + public String tio(Model model){ + model.addAttribute("msg","Tio Socket!"); + return "tio"; + } } diff --git a/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java b/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java new file mode 100644 index 0000000..a59e5c4 --- /dev/null +++ b/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java @@ -0,0 +1,39 @@ +package com.hello.socket; + +import org.springframework.stereotype.Component; +import org.tio.core.ChannelContext; +import org.tio.http.common.HttpRequest; +import org.tio.http.common.HttpResponse; +import org.tio.websocket.common.WsRequest; +import org.tio.websocket.server.handler.IWsMsgHandler; + +@Component +public class TioMsgHandler implements IWsMsgHandler { + @Override + public Object onText(WsRequest wsRequest, String msg, ChannelContext channelContext) throws Exception { + System.out.printf("收到文本消息:%s\n", msg); + return String.format("收到消息: %s", msg); + } + + @Override + public Object onBytes(WsRequest wsRequest, byte[] bytes, ChannelContext channelContext) throws Exception { + System.out.printf("收到二进制数据:%d\n", bytes.length); + return null; + } + + @Override + public HttpResponse handshake(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception { + return httpResponse; + } + + @Override + public void onAfterHandshaked(HttpRequest httpRequest, HttpResponse httpResponse, ChannelContext channelContext) throws Exception { + System.out.println("连接成功"); + } + + @Override + public Object onClose(WsRequest wsRequest, byte[] bytes, ChannelContext channelContext) throws Exception { + System.out.println("关闭连接"); + return null; + } +} diff --git a/HelloSocket/src/main/resources/application.properties b/HelloSocket/src/main/resources/application.properties deleted file mode 100644 index 8b13789..0000000 --- a/HelloSocket/src/main/resources/application.properties +++ /dev/null @@ -1 +0,0 @@ - diff --git a/HelloSocket/src/main/resources/application.yml b/HelloSocket/src/main/resources/application.yml new file mode 100644 index 0000000..29a8bd0 --- /dev/null +++ b/HelloSocket/src/main/resources/application.yml @@ -0,0 +1,4 @@ +tio: + websocket: + server: + port: 8200 diff --git a/HelloSocket/src/main/resources/templates/socket.ftl b/HelloSocket/src/main/resources/templates/socket.ftl index 92745a7..7c1c1ec 100644 --- a/HelloSocket/src/main/resources/templates/socket.ftl +++ b/HelloSocket/src/main/resources/templates/socket.ftl @@ -51,6 +51,8 @@ +${msg} +
uid:

msg: diff --git a/HelloSocket/src/main/resources/templates/tio.ftl b/HelloSocket/src/main/resources/templates/tio.ftl new file mode 100644 index 0000000..23b9889 --- /dev/null +++ b/HelloSocket/src/main/resources/templates/tio.ftl @@ -0,0 +1,74 @@ + + + + + HelloSocket + + + + + + +${msg} + +
uid: +
+
msg: +
+ +
+
+ +
+
+
+ +
+ +
+
+ + + \ No newline at end of file From 58a8c6984350043a149fe4c58aff85f8e3158aeb Mon Sep 17 00:00:00 2001 From: dingxl Date: Mon, 16 Mar 2020 22:04:25 +0800 Subject: [PATCH 12/20] add tio Socket --- .../java/com/hello/socket/SocketServer.java | 38 +++++++++---------- .../java/com/hello/socket/TioMsgHandler.java | 12 ++++++ .../src/main/resources/application.yml | 1 + .../src/main/resources/templates/socket.ftl | 4 +- .../src/main/resources/templates/tio.ftl | 4 +- 5 files changed, 34 insertions(+), 25 deletions(-) diff --git a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java index 9a49263..a080e35 100644 --- a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java +++ b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java @@ -19,52 +19,52 @@ public class SocketServer { private static ConcurrentHashMap webSocketMap = new ConcurrentHashMap<>(); private Session session; - private String userId; + private String uid; - public static void sendMessage(String userId, String message) { - System.out.printf("Send message: %s, %s", userId, message); - if (StringUtils.isNotBlank(userId) && webSocketMap.containsKey(userId)) { - webSocketMap.get(userId).sendMessage(message); + public static void sendMessage(String uid, String msg) { + System.out.printf("Send message: %s, %s", uid, msg); + if (StringUtils.isNotBlank(uid) && webSocketMap.containsKey(uid)) { + webSocketMap.get(uid).sendMessage(msg); } else { - System.err.printf("Offline: %s\n", userId); + System.err.printf("Offline: %s\n", uid); } } - private void sendMessage(String message) { + private void sendMessage(String msg) { try { - session.getBasicRemote().sendText(message); + session.getBasicRemote().sendText(msg); } catch (IOException e) { System.err.println(e.getMessage()); } } @OnMessage - public void onMessage(String message, Session session) { - System.out.printf("Receive message: %s, %s\n", userId, message); + public void onMessage(String msg, Session session) { + System.out.printf("Receive message: %s, %s\n", uid, msg); - for (String userId : webSocketMap.keySet()) { - sendMessage(userId, String.format("%s消息: %s", userId.equals(this.userId) ? "自己" : "转发", message)); + for (String uid : webSocketMap.keySet()) { + sendMessage(uid, String.format("%s消息: %s", uid.equals(this.uid) ? "自己" : "转发", msg)); } } @OnOpen - public void onOpen(Session session, @PathParam("uid") String userId) { + public void onOpen(Session session, @PathParam("uid") String uid) { this.session = session; - this.userId = userId; + this.uid = uid; - webSocketMap.put(userId, this); - System.out.printf("Online: %d, %s\n", webSocketMap.size(), userId); + webSocketMap.put(uid, this); + System.out.printf("Online: %d, %s\n", webSocketMap.size(), uid); sendMessage("连接成功"); } @OnClose public void onClose() { - webSocketMap.remove(userId); - System.out.printf("Offline: %d, %s\n", webSocketMap.size(), userId); + webSocketMap.remove(uid); + System.out.printf("Offline: %d, %s\n", webSocketMap.size(), uid); } @OnError public void onError(Session session, Throwable error) { - System.err.printf("Error: %s, %s\n", userId, error.getMessage()); + System.err.printf("Error: %s, %s\n", uid, error.getMessage()); } } diff --git a/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java b/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java index a59e5c4..257b53a 100644 --- a/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java +++ b/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java @@ -1,17 +1,29 @@ package com.hello.socket; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.tio.core.ChannelContext; +import org.tio.core.Tio; import org.tio.http.common.HttpRequest; import org.tio.http.common.HttpResponse; import org.tio.websocket.common.WsRequest; +import org.tio.websocket.common.WsResponse; import org.tio.websocket.server.handler.IWsMsgHandler; +import org.tio.websocket.starter.TioWebSocketServerBootstrap; @Component public class TioMsgHandler implements IWsMsgHandler { + @Autowired + private TioWebSocketServerBootstrap tioServer; + @Override public Object onText(WsRequest wsRequest, String msg, ChannelContext channelContext) throws Exception { System.out.printf("收到文本消息:%s\n", msg); + + Tio.sendToAll( + tioServer.getServerTioConfig(), + WsResponse.fromText(String.format("转发消息: %s", msg),"utf-8") + ); return String.format("收到消息: %s", msg); } diff --git a/HelloSocket/src/main/resources/application.yml b/HelloSocket/src/main/resources/application.yml index 29a8bd0..30e201e 100644 --- a/HelloSocket/src/main/resources/application.yml +++ b/HelloSocket/src/main/resources/application.yml @@ -2,3 +2,4 @@ tio: websocket: server: port: 8200 + heartbeat-timeout: 100000 diff --git a/HelloSocket/src/main/resources/templates/socket.ftl b/HelloSocket/src/main/resources/templates/socket.ftl index 7c1c1ec..5cee77d 100644 --- a/HelloSocket/src/main/resources/templates/socket.ftl +++ b/HelloSocket/src/main/resources/templates/socket.ftl @@ -40,9 +40,7 @@ } function sendMessage() { - if (typeof(WebSocket) === "undefined") { - $("#status").html("浏览器不支持WebSocket"); - } else if (socket === undefined) { + if (socket === undefined) { $("#status").html("请先连接Socket"); } else { socket.send($("#msg").val() + ', ' + new Date().getTime()); diff --git a/HelloSocket/src/main/resources/templates/tio.ftl b/HelloSocket/src/main/resources/templates/tio.ftl index 23b9889..c84f09b 100644 --- a/HelloSocket/src/main/resources/templates/tio.ftl +++ b/HelloSocket/src/main/resources/templates/tio.ftl @@ -40,9 +40,7 @@ } function sendMessage() { - if (typeof(WebSocket) === "undefined") { - $("#status").html("浏览器不支持WebSocket"); - } else if (socket === undefined) { + if (socket === undefined) { $("#status").html("请先连接Socket"); } else { socket.send($("#msg").val() + ', ' + new Date().getTime()); From 1be1130813b74a8fc833860e91d0d75adad76e2b Mon Sep 17 00:00:00 2001 From: dingxl Date: Mon, 16 Mar 2020 22:10:02 +0800 Subject: [PATCH 13/20] update timeout --- HelloSocket/src/main/resources/application.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HelloSocket/src/main/resources/application.yml b/HelloSocket/src/main/resources/application.yml index 30e201e..c66101b 100644 --- a/HelloSocket/src/main/resources/application.yml +++ b/HelloSocket/src/main/resources/application.yml @@ -2,4 +2,4 @@ tio: websocket: server: port: 8200 - heartbeat-timeout: 100000 + heartbeat-timeout: 3600000 From b181d2bc3fc94a7305e6db345ddf78cfd06afc1a Mon Sep 17 00:00:00 2001 From: dingxl Date: Mon, 16 Mar 2020 22:38:51 +0800 Subject: [PATCH 14/20] update text --- HelloSocket/src/main/resources/templates/socket.ftl | 2 +- HelloSocket/src/main/resources/templates/tio.ftl | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/HelloSocket/src/main/resources/templates/socket.ftl b/HelloSocket/src/main/resources/templates/socket.ftl index 5cee77d..55e297f 100644 --- a/HelloSocket/src/main/resources/templates/socket.ftl +++ b/HelloSocket/src/main/resources/templates/socket.ftl @@ -43,7 +43,7 @@ if (socket === undefined) { $("#status").html("请先连接Socket"); } else { - socket.send($("#msg").val() + ', ' + new Date().getTime()); + socket.send($("#msg").val() + ", " + new Date().getTime()); } } diff --git a/HelloSocket/src/main/resources/templates/tio.ftl b/HelloSocket/src/main/resources/templates/tio.ftl index c84f09b..d130932 100644 --- a/HelloSocket/src/main/resources/templates/tio.ftl +++ b/HelloSocket/src/main/resources/templates/tio.ftl @@ -43,7 +43,7 @@ if (socket === undefined) { $("#status").html("请先连接Socket"); } else { - socket.send($("#msg").val() + ', ' + new Date().getTime()); + socket.send($("#uid").val() + " " + $("#msg").val() + ", " + new Date().getTime()); } } From 0450dac4e43ee3b5872287caedf983c0667d784e Mon Sep 17 00:00:00 2001 From: dingxl Date: Tue, 17 Mar 2020 09:16:18 +0800 Subject: [PATCH 15/20] =?UTF-8?q?=E5=8D=87=E7=BA=A7tioWebSocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- HelloSocket/pom.xml | 2 +- .../src/main/java/com/hello/socket/SocketServer.java | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/HelloSocket/pom.xml b/HelloSocket/pom.xml index 9cc455c..4843f09 100644 --- a/HelloSocket/pom.xml +++ b/HelloSocket/pom.xml @@ -34,7 +34,7 @@ org.t-io tio-websocket-spring-boot-starter - 3.5.5.v20191010-RELEASE + 3.6.0.v20200315-RELEASE diff --git a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java index a080e35..60cb9f4 100644 --- a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java +++ b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java @@ -40,7 +40,7 @@ private void sendMessage(String msg) { @OnMessage public void onMessage(String msg, Session session) { - System.out.printf("Receive message: %s, %s\n", uid, msg); + System.out.printf("Receive message: %s, %s, %s\n", uid, session.getId(), msg); for (String uid : webSocketMap.keySet()) { sendMessage(uid, String.format("%s消息: %s", uid.equals(this.uid) ? "自己" : "转发", msg)); @@ -60,11 +60,11 @@ public void onOpen(Session session, @PathParam("uid") String uid) { @OnClose public void onClose() { webSocketMap.remove(uid); - System.out.printf("Offline: %d, %s\n", webSocketMap.size(), uid); + System.out.printf("Offline 1, %s, online: %d\n", uid, webSocketMap.size()); } @OnError - public void onError(Session session, Throwable error) { - System.err.printf("Error: %s, %s\n", uid, error.getMessage()); + public void onError(Session session, Throwable e) { + System.err.printf("Error: %s, %s, %s\n", uid, session.getId(), e.getMessage()); } } From 56bcfe617ff37efd6a7a72bfa3158220d07aba69 Mon Sep 17 00:00:00 2001 From: dingxl Date: Fri, 20 Mar 2020 08:51:08 +0800 Subject: [PATCH 16/20] update web socket --- .../src/main/java/com/hello/socket/SocketServer.java | 4 ++-- .../main/java/com/hello/socket/TioMsgHandler.java | 9 +++++---- HelloSocket/src/main/resources/templates/socket.ftl | 12 ++++++------ HelloSocket/src/main/resources/templates/tio.ftl | 12 ++++++------ 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java index 60cb9f4..5e7609d 100644 --- a/HelloSocket/src/main/java/com/hello/socket/SocketServer.java +++ b/HelloSocket/src/main/java/com/hello/socket/SocketServer.java @@ -22,7 +22,7 @@ public class SocketServer { private String uid; public static void sendMessage(String uid, String msg) { - System.out.printf("Send message: %s, %s", uid, msg); + System.out.printf("Send message: %s, %s\n", uid, msg); if (StringUtils.isNotBlank(uid) && webSocketMap.containsKey(uid)) { webSocketMap.get(uid).sendMessage(msg); } else { @@ -30,7 +30,7 @@ public static void sendMessage(String uid, String msg) { } } - private void sendMessage(String msg) { + public void sendMessage(String msg) { try { session.getBasicRemote().sendText(msg); } catch (IOException e) { diff --git a/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java b/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java index 257b53a..f2972c1 100644 --- a/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java +++ b/HelloSocket/src/main/java/com/hello/socket/TioMsgHandler.java @@ -16,14 +16,15 @@ public class TioMsgHandler implements IWsMsgHandler { @Autowired private TioWebSocketServerBootstrap tioServer; + public void sendMessage(String msg) { + Tio.sendToAll(tioServer.getServerTioConfig(), WsResponse.fromText(msg, "utf-8")); + } + @Override public Object onText(WsRequest wsRequest, String msg, ChannelContext channelContext) throws Exception { System.out.printf("收到文本消息:%s\n", msg); - Tio.sendToAll( - tioServer.getServerTioConfig(), - WsResponse.fromText(String.format("转发消息: %s", msg),"utf-8") - ); + sendMessage(String.format("转发消息: %s", msg)); return String.format("收到消息: %s", msg); } diff --git a/HelloSocket/src/main/resources/templates/socket.ftl b/HelloSocket/src/main/resources/templates/socket.ftl index 55e297f..0ce742c 100644 --- a/HelloSocket/src/main/resources/templates/socket.ftl +++ b/HelloSocket/src/main/resources/templates/socket.ftl @@ -21,21 +21,21 @@ // 建立连接 var socketUrl = "ws://localhost:8080/ws/" + $("#uid").val(); socket = new WebSocket(socketUrl); - socket.onopen = function () { - $("#status").html("WebSocket连接成功"); - }; - socket.onmessage = function (msg) { $("#status").html(msg.data); }; + socket.onopen = function () { + $("#status").html("WebSocket连接成功"); + }; + socket.onclose = function () { $("#status").html("WebSocket关闭连接"); }; socket.onerror = function () { $("#status").html("WebSocket错误"); - } + }; } } @@ -53,7 +53,7 @@ ${msg}
uid:
-
msg: +
msg:

diff --git a/HelloSocket/src/main/resources/templates/tio.ftl b/HelloSocket/src/main/resources/templates/tio.ftl index d130932..4a06d1a 100644 --- a/HelloSocket/src/main/resources/templates/tio.ftl +++ b/HelloSocket/src/main/resources/templates/tio.ftl @@ -21,21 +21,21 @@ // 建立连接 var socketUrl = "ws://localhost:8200/"; socket = new WebSocket(socketUrl); - socket.onopen = function () { - $("#status").html("WebSocket连接成功"); - }; - socket.onmessage = function (msg) { $("#status").html(msg.data); }; + socket.onopen = function () { + $("#status").html("WebSocket连接成功"); + }; + socket.onclose = function () { $("#status").html("WebSocket关闭连接"); }; socket.onerror = function () { $("#status").html("WebSocket错误"); - } + }; } } @@ -53,7 +53,7 @@ ${msg}
uid:
-
msg: +
msg:

From 29a8ba20440192e99a88a42e9c5914952d555fac Mon Sep 17 00:00:00 2001 From: dingxl Date: Tue, 2 Feb 2021 22:30:57 +0800 Subject: [PATCH 17/20] Hello Shiro --- .../src/main/resources/application.yml | 6 +- HelloPDF/pom.xml | 95 ++++++ HelloPDF/src/main/java/com/hello/App.java | 14 + HelloPDF/src/main/java/com/hello/PDFUtil.java | 49 +++ HelloShiro/.gitignore | 33 ++ .../.mvn/wrapper/MavenWrapperDownloader.java | 117 +++++++ HelloShiro/.mvn/wrapper/maven-wrapper.jar | Bin 0 -> 50710 bytes .../.mvn/wrapper/maven-wrapper.properties | 2 + HelloShiro/mvnw | 310 ++++++++++++++++++ HelloShiro/mvnw.cmd | 182 ++++++++++ HelloShiro/pom.xml | 57 ++++ .../hello_shiro.postman_collection.json | 95 ++++++ .../hello/shiro/HelloShiroApplication.java | 14 + .../hello/shiro/config/ExceptionAdvice.java | 29 ++ .../com/hello/shiro/config/ShiroConfig.java | 77 +++++ .../com/hello/shiro/config/ShiroRealm.java | 65 ++++ .../hello/shiro/controller/ApiController.java | 66 ++++ .../com/hello/shiro/model/Permission.java | 17 + .../main/java/com/hello/shiro/model/Role.java | 20 ++ .../main/java/com/hello/shiro/model/User.java | 18 + .../com/hello/shiro/service/LoginService.java | 45 +++ HelloShiro/src/main/resources/application.yml | 2 + .../shiro/HelloShiroApplicationTest.java | 14 + pom.xml | 2 + 24 files changed, 1326 insertions(+), 3 deletions(-) create mode 100644 HelloPDF/pom.xml create mode 100644 HelloPDF/src/main/java/com/hello/App.java create mode 100644 HelloPDF/src/main/java/com/hello/PDFUtil.java create mode 100644 HelloShiro/.gitignore create mode 100644 HelloShiro/.mvn/wrapper/MavenWrapperDownloader.java create mode 100644 HelloShiro/.mvn/wrapper/maven-wrapper.jar create mode 100644 HelloShiro/.mvn/wrapper/maven-wrapper.properties create mode 100644 HelloShiro/mvnw create mode 100644 HelloShiro/mvnw.cmd create mode 100644 HelloShiro/pom.xml create mode 100644 HelloShiro/postman/hello_shiro.postman_collection.json create mode 100644 HelloShiro/src/main/java/com/hello/shiro/HelloShiroApplication.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/config/ExceptionAdvice.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/config/ShiroConfig.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/controller/ApiController.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/model/Permission.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/model/Role.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/model/User.java create mode 100644 HelloShiro/src/main/java/com/hello/shiro/service/LoginService.java create mode 100644 HelloShiro/src/main/resources/application.yml create mode 100644 HelloShiro/src/test/java/com/hello/shiro/HelloShiroApplicationTest.java diff --git a/HelloFlyway/src/main/resources/application.yml b/HelloFlyway/src/main/resources/application.yml index ede9447..234e165 100644 --- a/HelloFlyway/src/main/resources/application.yml +++ b/HelloFlyway/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://127.0.0.1:3306/flyway?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC - username: dba - password: dba + url: jdbc:mysql://127.0.0.1:3306/starter?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=UTC + username: root + password: root diff --git a/HelloPDF/pom.xml b/HelloPDF/pom.xml new file mode 100644 index 0000000..6566f27 --- /dev/null +++ b/HelloPDF/pom.xml @@ -0,0 +1,95 @@ + + + + 4.0.0 + + com.hello + HelloPDF + 0.0.1-SNAPSHOT + + HelloPDF + + http://www.example.com + + + UTF-8 + 1.7 + 1.7 + + + + + com.e-iceblue + e-iceblue + http://repo.e-iceblue.com/nexus/content/groups/public/ + + + + + + org.apache.pdfbox + pdfbox + 2.0.4 + + + + e-iceblue + spire.pdf.free + 2.2.2 + + + + junit + junit + 4.11 + test + + + + + + + + + maven-clean-plugin + 3.1.0 + + + + maven-resources-plugin + 3.0.2 + + + maven-compiler-plugin + 3.8.0 + + + maven-surefire-plugin + 2.22.1 + + + maven-jar-plugin + 3.0.2 + + + maven-install-plugin + 2.5.2 + + + maven-deploy-plugin + 2.8.2 + + + + maven-site-plugin + 3.7.1 + + + maven-project-info-reports-plugin + 3.0.0 + + + + + diff --git a/HelloPDF/src/main/java/com/hello/App.java b/HelloPDF/src/main/java/com/hello/App.java new file mode 100644 index 0000000..f6eaca9 --- /dev/null +++ b/HelloPDF/src/main/java/com/hello/App.java @@ -0,0 +1,14 @@ +package com.hello; + +/** + * Hello world! + */ +public class App { + public static void main(String[] args) { + System.out.println("Hello World!"); + + + String fileName = "测试.pdf"; + PDFUtil.readPDF(fileName); + } +} diff --git a/HelloPDF/src/main/java/com/hello/PDFUtil.java b/HelloPDF/src/main/java/com/hello/PDFUtil.java new file mode 100644 index 0000000..6952792 --- /dev/null +++ b/HelloPDF/src/main/java/com/hello/PDFUtil.java @@ -0,0 +1,49 @@ +package com.hello; + +import java.io.*; +import org.apache.pdfbox.*; + +public class PDFUtil { + /** + * 读PDF文件,使用了pdfbox开源项目 + */ + public static void readPDF(String fileName) { + File file = new File(fileName); + FileInputStream in = null; + try { + in = new FileInputStream(fileName); + + // 新建一个PDF解析器对象 + PDFParser parser = new PDFParser(new RandomAccessFile(file, "rw")); + + // 对PDF文件进行解析 + parser.parse(); + + // 获取解析后得到的PDF文档对象 + PDDocument pdfdocument = parser.getPDDocument(); + + // 新建一个PDF文本剥离器 + PDFTextStripper stripper = new PDFTextStripper(); + stripper.setSortByPosition(sort); //sort设置为true 则按照行进行读取,默认是false + + // 从PDF文档对象中剥离文本 + String result = stripper.getText(pdfdocument); + FileWriter fileWriter = new FileWriter(new File("pdf.txt")); + fileWriter.write(result); + fileWriter.flush(); + fileWriter.close(); + System.out.println("PDF文件的文本内容如下:"); + System.out.println(result); + } catch (Exception e) { + System.out.println("读取PDF文件" + file.getAbsolutePath() + "生失败!" + e); + e.printStackTrace(); + } finally { + if (in != null) { + try { + in.close(); + } catch (IOException e1) { + } + } + } + } +} diff --git a/HelloShiro/.gitignore b/HelloShiro/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/HelloShiro/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/HelloShiro/.mvn/wrapper/MavenWrapperDownloader.java b/HelloShiro/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..e76d1f3 --- /dev/null +++ b/HelloShiro/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,117 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if(mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if(mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if(!outputFile.getParentFile().exists()) { + if(!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/HelloShiro/.mvn/wrapper/maven-wrapper.jar b/HelloShiro/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..2cc7d4a55c0cd0092912bf49ae38b3a9e3fd0054 GIT binary patch literal 50710 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 EfAhh=DF6Tf literal 0 HcmV?d00001 diff --git a/HelloShiro/.mvn/wrapper/maven-wrapper.properties b/HelloShiro/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..642d572 --- /dev/null +++ b/HelloShiro/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/HelloShiro/mvnw b/HelloShiro/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/HelloShiro/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/HelloShiro/mvnw.cmd b/HelloShiro/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/HelloShiro/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/HelloShiro/pom.xml b/HelloShiro/pom.xml new file mode 100644 index 0000000..13ff89e --- /dev/null +++ b/HelloShiro/pom.xml @@ -0,0 +1,57 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.3.4.RELEASE + + + + com.hello + spring-shiro-demo + 0.0.1-SNAPSHOT + spring-shiro-demo + Demo project for Spring Boot + + + 1.8 + 1.6.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.apache.shiro + shiro-spring + ${spring.shiro.version} + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + diff --git a/HelloShiro/postman/hello_shiro.postman_collection.json b/HelloShiro/postman/hello_shiro.postman_collection.json new file mode 100644 index 0000000..3f36f95 --- /dev/null +++ b/HelloShiro/postman/hello_shiro.postman_collection.json @@ -0,0 +1,95 @@ +{ + "info": { + "_postman_id": "9ede35c7-f565-440d-a504-65bc372351df", + "name": "hello_shiro", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + }, + "item": [ + { + "name": "http://localhost:8080/login?userName=admin&password=123456", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/login?userName=user&password=123456", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "login" + ], + "query": [ + { + "key": "userName", + "value": "user" + }, + { + "key": "password", + "value": "123456" + } + ] + } + }, + "response": [] + }, + { + "name": "http://localhost:8080/admin", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/admin", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "admin" + ] + } + }, + "response": [] + }, + { + "name": "http://localhost:8080/query", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/query", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "query" + ] + } + }, + "response": [] + }, + { + "name": "http://localhost:8080/add", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "http://localhost:8080/add", + "protocol": "http", + "host": [ + "localhost" + ], + "port": "8080", + "path": [ + "add" + ] + } + }, + "response": [] + } + ] +} \ No newline at end of file diff --git a/HelloShiro/src/main/java/com/hello/shiro/HelloShiroApplication.java b/HelloShiro/src/main/java/com/hello/shiro/HelloShiroApplication.java new file mode 100644 index 0000000..85b5377 --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/HelloShiroApplication.java @@ -0,0 +1,14 @@ +package com.hello.shiro; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @author dingxl + */ +@SpringBootApplication +public class HelloShiroApplication { + public static void main(String[] args) { + SpringApplication.run(HelloShiroApplication.class, args); + } +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/config/ExceptionAdvice.java b/HelloShiro/src/main/java/com/hello/shiro/config/ExceptionAdvice.java new file mode 100644 index 0000000..17b675f --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/config/ExceptionAdvice.java @@ -0,0 +1,29 @@ +package com.hello.shiro.config; + +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authz.AuthorizationException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +/** + * @author dingxl + */ +@ControllerAdvice +@Slf4j +public class ExceptionAdvice { + @ExceptionHandler + @ResponseBody + public String authorizationException(AuthorizationException e) { + log.error("没有通过权限验证!", e); + return e.getMessage(); + } + + @ExceptionHandler + @ResponseBody + public String authenticationException(AuthenticationException e) { + log.error("没有通过用户认证!", e); + return e.getMessage(); + } +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/config/ShiroConfig.java b/HelloShiro/src/main/java/com/hello/shiro/config/ShiroConfig.java new file mode 100644 index 0000000..4086087 --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/config/ShiroConfig.java @@ -0,0 +1,77 @@ +package com.hello.shiro.config; + +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.HashMap; + +@Configuration +public class ShiroConfig { + @Bean + @ConditionalOnMissingBean + public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() { + return new DefaultAdvisorAutoProxyCreator() {{ + setProxyTargetClass(true); + }}; + } + + /** + * 将验证方式加入容器 + */ + @Bean + public ShiroRealm shiroRealm() { + return new ShiroRealm(); + } + + /** + * 配置Realm管理认证 + */ + @Bean + public SecurityManager securityManager() { + return new DefaultWebSecurityManager() {{ + setRealm(shiroRealm()); + }}; + } + + /** + * 设置对应的过滤条件和跳转条件 + */ + @Bean + public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { + ShiroFilterFactoryBean filterFactory = new ShiroFilterFactoryBean() {{ + // 登录 + setLoginUrl("/login"); + // 首页 + setSuccessUrl("/index"); + // 错误页面,认证不通过跳转 + setUnauthorizedUrl("/error"); + }}; + + filterFactory.setFilterChainDefinitionMap(new HashMap() {{ + // 登出 + put("/logout", "logout"); + + // 对所有用户认证 + put("/**", "authc"); + }}); + + filterFactory.setSecurityManager(securityManager); + return filterFactory; + } + + /** + * 注入权限管理 + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor(); + advisor.setSecurityManager(securityManager); + return advisor; + } +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java b/HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java new file mode 100644 index 0000000..614a697 --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java @@ -0,0 +1,65 @@ +package com.hello.shiro.config; + +import com.hello.shiro.model.Permission; +import com.hello.shiro.model.Role; +import com.hello.shiro.model.User; +import com.hello.shiro.service.LoginService; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; + +/** + * @author dingxl + */ +public class ShiroRealm extends AuthorizingRealm { + @Autowired + LoginService loginService; + + /** + * 权限配置类 + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { + // 查询用户 + String name = principalCollection.getPrimaryPrincipal().toString(); + User user = loginService.getUserByName(name); + if (user == null) { + return null; + } + + // 添加角色和权限 + SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo(); + for (Role role : user.getRoles()) { + simpleAuthorizationInfo.addRole(role.getRoleName()); + + for (Permission permissions : role.getPermissions()) { + simpleAuthorizationInfo.addStringPermission(permissions.getPermissionName()); + } + } + return simpleAuthorizationInfo; + } + + /** + * 认证配置类 + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException { + if (StringUtils.isEmpty(authenticationToken.getPrincipal())) { + return null; + } + + // 获取用户信息 + String name = authenticationToken.getPrincipal().toString(); + User user = loginService.getUserByName(name); + + // 验证authenticationToken和simpleAuthenticationInfo + return user == null ? null : new SimpleAuthenticationInfo(name, user.getPassword(), getName()); + } +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/controller/ApiController.java b/HelloShiro/src/main/java/com/hello/shiro/controller/ApiController.java new file mode 100644 index 0000000..5edc37b --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/controller/ApiController.java @@ -0,0 +1,66 @@ +package com.hello.shiro.controller; + +import com.hello.shiro.model.User; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authc.UsernamePasswordToken; +import org.apache.shiro.authz.AuthorizationException; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.apache.shiro.subject.Subject; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author dingxl + */ +@RestController +@Slf4j +public class ApiController { + @GetMapping("/login") + public String login(User user) { + if (StringUtils.isEmpty(user.getUserName()) || StringUtils.isEmpty(user.getPassword())) { + return "请输入用户名和密码!"; + } + + Subject subject = SecurityUtils.getSubject(); + try { + // 用户认证 + subject.login(new UsernamePasswordToken( + user.getUserName(), + user.getPassword() + )); + } catch (UnknownAccountException e) { + log.error("用户名不存在!", e); + return "用户名不存在!"; + } catch (AuthenticationException e) { + log.error("账号或密码错误!", e); + return "账号或密码错误!"; + } catch (AuthorizationException e) { + log.error("没有权限!", e); + return "没有权限"; + } + return "login success"; + } + + @RequiresRoles("admin") + @GetMapping("/admin") + public String admin() { + return "admin success!"; + } + + @RequiresPermissions("query") + @GetMapping("/query") + public String query() { + return "query success!"; + } + + @RequiresPermissions("add") + @GetMapping("/add") + public String add() { + return "add success!"; + } +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/model/Permission.java b/HelloShiro/src/main/java/com/hello/shiro/model/Permission.java new file mode 100644 index 0000000..e18efd4 --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/model/Permission.java @@ -0,0 +1,17 @@ +package com.hello.shiro.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +/** + * @author dingxl + */ +@Data +@AllArgsConstructor +public class Permission { + public static final String QUERY = "query"; + public static final String ADD = "add"; + + private String id; + private String permissionName; +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/model/Role.java b/HelloShiro/src/main/java/com/hello/shiro/model/Role.java new file mode 100644 index 0000000..0088856 --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/model/Role.java @@ -0,0 +1,20 @@ +package com.hello.shiro.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Set; + +/** + * @author dingxl + */ +@Data +@AllArgsConstructor +public class Role { + public static final String ADMIN = "admin"; + public static final String USER = "user"; + + private String id; + private String roleName; + private Set permissions; +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/model/User.java b/HelloShiro/src/main/java/com/hello/shiro/model/User.java new file mode 100644 index 0000000..476e845 --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/model/User.java @@ -0,0 +1,18 @@ +package com.hello.shiro.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.util.Set; + +/** + * @author dingxl + */ +@Data +@AllArgsConstructor +public class User { + private String id; + private String userName; + private String password; + private Set roles; +} diff --git a/HelloShiro/src/main/java/com/hello/shiro/service/LoginService.java b/HelloShiro/src/main/java/com/hello/shiro/service/LoginService.java new file mode 100644 index 0000000..1ab52d3 --- /dev/null +++ b/HelloShiro/src/main/java/com/hello/shiro/service/LoginService.java @@ -0,0 +1,45 @@ +package com.hello.shiro.service; + +import com.hello.shiro.model.Permission; +import com.hello.shiro.model.Role; +import com.hello.shiro.model.User; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +/** + * @author dingxl + */ +@Service +public class LoginService { + static final Map USER_MAP; + + static { + Permission permissionsQuery = new Permission("1", Permission.QUERY); + Permission permissionsAdd = new Permission("2", Permission.ADD); + + User admin = new User("1", "admin", "123456", new HashSet() {{ + add(new Role("1", Role.ADMIN, new HashSet() {{ + add(permissionsQuery); + add(permissionsAdd); + }})); + }}); + + User user = new User("2", "user", "123456", new HashSet() {{ + add(new Role("2", Role.USER, new HashSet() {{ + add(permissionsQuery); + }})); + }}); + + USER_MAP = new HashMap() {{ + put(admin.getUserName(), admin); + put(user.getUserName(), user); + }}; + } + + public User getUserByName(String userName) { + return USER_MAP.get(userName); + } +} diff --git a/HelloShiro/src/main/resources/application.yml b/HelloShiro/src/main/resources/application.yml new file mode 100644 index 0000000..a7afc92 --- /dev/null +++ b/HelloShiro/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 8080 diff --git a/HelloShiro/src/test/java/com/hello/shiro/HelloShiroApplicationTest.java b/HelloShiro/src/test/java/com/hello/shiro/HelloShiroApplicationTest.java new file mode 100644 index 0000000..f053929 --- /dev/null +++ b/HelloShiro/src/test/java/com/hello/shiro/HelloShiroApplicationTest.java @@ -0,0 +1,14 @@ +package com.hello.shiro; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class HelloShiroApplicationTest { + @Test + public void contextLoads() { + } +} diff --git a/pom.xml b/pom.xml index fd38d30..c3c3ab7 100644 --- a/pom.xml +++ b/pom.xml @@ -31,9 +31,11 @@ HelloJUnit HelloMyBatis HelloOrder + HelloPDF HelloQuartz HelloRedis HelloRunner + HelloShiro HelloSingleton HelloSocket HelloThread From 8f289a9296c9cd86b0e26b6597ff28d6714d0ff8 Mon Sep 17 00:00:00 2001 From: dingxl Date: Wed, 3 Feb 2021 13:49:51 +0800 Subject: [PATCH 18/20] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E6=9D=83=E9=99=90?= =?UTF-8?q?=E9=85=8D=E7=BD=AEshiro?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../hello/shiro/{controller => }/ApiController.java | 11 +++++++---- .../main/java/com/hello/shiro/config/ShiroRealm.java | 8 ++++---- .../service/{LoginService.java => UserService.java} | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) rename HelloShiro/src/main/java/com/hello/shiro/{controller => }/ApiController.java (88%) rename HelloShiro/src/main/java/com/hello/shiro/service/{LoginService.java => UserService.java} (97%) diff --git a/HelloShiro/src/main/java/com/hello/shiro/controller/ApiController.java b/HelloShiro/src/main/java/com/hello/shiro/ApiController.java similarity index 88% rename from HelloShiro/src/main/java/com/hello/shiro/controller/ApiController.java rename to HelloShiro/src/main/java/com/hello/shiro/ApiController.java index 5edc37b..e33c374 100644 --- a/HelloShiro/src/main/java/com/hello/shiro/controller/ApiController.java +++ b/HelloShiro/src/main/java/com/hello/shiro/ApiController.java @@ -1,5 +1,7 @@ -package com.hello.shiro.controller; +package com.hello.shiro; +import com.hello.shiro.model.Permission; +import com.hello.shiro.model.Role; import com.hello.shiro.model.User; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; @@ -46,19 +48,20 @@ public String login(User user) { return "login success"; } - @RequiresRoles("admin") + @RequiresRoles(Role.ADMIN) @GetMapping("/admin") public String admin() { return "admin success!"; } - @RequiresPermissions("query") + @RequiresRoles(Role.USER) + @RequiresPermissions(Permission.QUERY) @GetMapping("/query") public String query() { return "query success!"; } - @RequiresPermissions("add") + @RequiresPermissions(Permission.ADD) @GetMapping("/add") public String add() { return "add success!"; diff --git a/HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java b/HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java index 614a697..66d52d2 100644 --- a/HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java +++ b/HelloShiro/src/main/java/com/hello/shiro/config/ShiroRealm.java @@ -3,7 +3,7 @@ import com.hello.shiro.model.Permission; import com.hello.shiro.model.Role; import com.hello.shiro.model.User; -import com.hello.shiro.service.LoginService; +import com.hello.shiro.service.UserService; import org.apache.shiro.authc.AuthenticationException; import org.apache.shiro.authc.AuthenticationInfo; import org.apache.shiro.authc.AuthenticationToken; @@ -20,7 +20,7 @@ */ public class ShiroRealm extends AuthorizingRealm { @Autowired - LoginService loginService; + UserService userService; /** * 权限配置类 @@ -29,7 +29,7 @@ public class ShiroRealm extends AuthorizingRealm { protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) { // 查询用户 String name = principalCollection.getPrimaryPrincipal().toString(); - User user = loginService.getUserByName(name); + User user = userService.getUserByName(name); if (user == null) { return null; } @@ -57,7 +57,7 @@ protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authent // 获取用户信息 String name = authenticationToken.getPrincipal().toString(); - User user = loginService.getUserByName(name); + User user = userService.getUserByName(name); // 验证authenticationToken和simpleAuthenticationInfo return user == null ? null : new SimpleAuthenticationInfo(name, user.getPassword(), getName()); diff --git a/HelloShiro/src/main/java/com/hello/shiro/service/LoginService.java b/HelloShiro/src/main/java/com/hello/shiro/service/UserService.java similarity index 97% rename from HelloShiro/src/main/java/com/hello/shiro/service/LoginService.java rename to HelloShiro/src/main/java/com/hello/shiro/service/UserService.java index 1ab52d3..fd81d41 100644 --- a/HelloShiro/src/main/java/com/hello/shiro/service/LoginService.java +++ b/HelloShiro/src/main/java/com/hello/shiro/service/UserService.java @@ -13,7 +13,7 @@ * @author dingxl */ @Service -public class LoginService { +public class UserService { static final Map USER_MAP; static { From 3ee6e74b5d7d754f88579ebed831cf2018a2eeed Mon Sep 17 00:00:00 2001 From: dingxl Date: Wed, 17 Mar 2021 10:17:43 +0800 Subject: [PATCH 19/20] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=88=97=E8=A1=A8?= =?UTF-8?q?=E4=B8=AD=E5=85=83=E7=B4=A0=E7=9A=84=E4=B8=A4=E4=B8=AA=E6=96=B9?= =?UTF-8?q?=E6=B3=95=EF=BC=8Clist.remove(),=20iterator.remove()?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/com/hello/ListRemoveTest.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 HelloHackerRank/src/test/java/com/hello/ListRemoveTest.java diff --git a/HelloHackerRank/src/test/java/com/hello/ListRemoveTest.java b/HelloHackerRank/src/test/java/com/hello/ListRemoveTest.java new file mode 100644 index 0000000..48e60f2 --- /dev/null +++ b/HelloHackerRank/src/test/java/com/hello/ListRemoveTest.java @@ -0,0 +1,75 @@ +package com.hello; + +import org.junit.Test; + +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + +/** + * @author dingxl + * @date 3/16/2021 7:05 PM + */ +public class ListRemoveTest { + @Test + public void testListRemoveException() { + List list = new ArrayList() {{ + add("0"); + add("1"); + add("2"); + add("3"); + add("4"); + }}; + + for (int i = 0; i < list.size(); i++) { + if (i % 2 == 0) { + System.out.printf("remove: %s\n", list.get(i)); + list.remove(i); + } else { + System.out.printf("keep: %s\n", list.get(i)); + } + } + } + + @Test + public void testListRemove() { + List list = new ArrayList() {{ + add("0"); + add("1"); + add("2"); + add("3"); + add("4"); + }}; + + for (int i = list.size() - 1; i >= 0; i--) { + if (i % 2 == 0) { + System.out.printf("remove: %s\n", list.get(i)); + list.remove(i); + } else { + System.out.printf("keep: %s\n", list.get(i)); + } + } + } + + @Test + public void testIteratorRemove() { + List list = new ArrayList() {{ + add("0"); + add("1"); + add("2"); + add("3"); + add("4"); + }}; + + Iterator it = list.iterator(); + while (it.hasNext()) { + String str = it.next(); + if (Integer.parseInt(str) % 2 == 0) { + System.out.printf("remove: %s\n", str); + it.remove(); + } else { + System.out.printf("keep: %s\n", str); + } + } + } +} From 921fa07430ba832edb68c12c195282f891b718f9 Mon Sep 17 00:00:00 2001 From: dingxl Date: Wed, 17 Mar 2021 10:19:38 +0800 Subject: [PATCH 20/20] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E6=8E=A8=E9=80=81=E8=84=9A=E6=9C=AC=EF=BC=8Cgithub=EF=BC=8Cgit?= =?UTF-8?q?ee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- push_master.sh | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 push_master.sh diff --git a/push_master.sh b/push_master.sh new file mode 100644 index 0000000..102d2bf --- /dev/null +++ b/push_master.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +git checkout master + +git push origin master +git push gitee master +git push github master