首页
友链
关于
免责声明
Search
1
王者营地战绩数据王者荣耀查询网页源码
6,209 阅读
2
群晖Active Backup for Business套件备份Linux服务器教程
4,384 阅读
3
影视分享
4,313 阅读
4
(亲测)Jrebel激活破解方式2019-08-21
4,289 阅读
5
centos7 安装及卸载 jekenis
3,573 阅读
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
登录
Search
标签搜索
docker
springboot
Spring Boot
java
linux
Shiro
Graphics2D
图片
游戏账号交易
Mybatis
Spring Cloud
centos
脚本
Web Station
群辉
王者营地
战绩查询
平台对接
Spring Cloud Alibaba
nacos
绿林寻猫
累计撰写
249
篇文章
累计收到
26
条评论
首页
栏目
日常
文章
后端
前端
Linux
异常
Flutter
分享
群辉
页面
友链
关于
免责声明
搜索到
40
篇与
前端
的结果
2021-12-08
JAVA爬虫模拟执行页面点击事件
所需依赖: <dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>com.springsource.com.gargoylesoftware.htmlunit</artifactId> <version>2.6.0</version> </dependency>代码示例import java.io.IOException; import java.net.MalformedURLException; import java.util.List; import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlElement; import com.gargoylesoftware.htmlunit.html.HtmlInput; import com.gargoylesoftware.htmlunit.html.HtmlPage; /** * 模拟点击,动态获取页面信息 * @Author: Uncle liu * @Date: 2019-10-07 15:39 */ public class JsoupHttpClient { private static class innerWebClient{ private static final WebClient webClient = new WebClient(); } /** * 获取指定网页实体 * @param url * @return */ public static HtmlPage getHtmlPage(String url){ //调用此方法时加载WebClient WebClient webClient = innerWebClient.webClient; // 取消 JS 支持 webClient.setJavaScriptEnabled(false); // 取消 CSS 支持 webClient.setCssEnabled(false); HtmlPage page=null; try{ // 获取指定网页实体 page = (HtmlPage) webClient.getPage(url); }catch (MalformedURLException e){ e.printStackTrace(); }catch (IOException e){ e.printStackTrace(); } return page; } public static void main(String[] args) throws Exception { // 获取指定网页实体 HtmlPage page = getHtmlPage("https://www.baidu.com/"); System.out.println(page.asText()); //asText()是以文本格式显示 System.out.println(page.asXml()); //asXml()是以xml格式显示 // 获取搜索输入框 HtmlInput input = page.getHtmlElementById("kw"); // 往输入框 “填值” input.setValueAttribute("绿林寻猫"); // 获取搜索按钮 HtmlInput btn = page.getHtmlElementById("su"); // “点击” 搜索 HtmlPage page2 = btn.click(); // 选择元素 List<HtmlElement> spanList=(List<HtmlElement>)page2.getByXPath("//h3[@class='t']/a"); for(int i=0;i<spanList.size();i++) { // 输出新页面的文本 System.out.println(i+1+"、"+spanList.get(i).asText()); } } }结果:
2021年12月08日
411 阅读
0 评论
0 点赞
2021-12-08
java 根据html模板生成html文件
1.代码部分import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import java.io.FileInputStream; import java.io.FileOutputStream; @RunWith(SpringRunner.class) @SpringBootTest public class PdfApplicationTests { @Test public void contextLoads() { String filePath = "D:\\WorkSpace\\IdeaProjects\\pdf\\src\\main\\resources\\templates\\index.html"; String text ="哈哈"; String disrPath = "D:\\WorkSpace\\IdeaProjects\\pdf\\src\\main\\resources\\templates"; String fileName = "t"; MakeHtml(filePath,text,disrPath,fileName); } /** * @Title: MakeHtml * @Description: 创建html * @param filePath 设定模板文件 * @param text 添加的内容 * @param disrPath 生成html的存放路径 * @param fileName 生成html名字 * @return void 返回类型 * @throws */ public static void MakeHtml(String filePath,String text,String disrPath,String fileName ){ try { String title = "<h2>"+text+"</h2>"; System.out.print(filePath); String templateContent = ""; FileInputStream fileinputstream = new FileInputStream(filePath);// 读取模板文件 int lenght = fileinputstream.available(); byte bytes[] = new byte[lenght]; fileinputstream.read(bytes); fileinputstream.close(); templateContent = new String(bytes); System.out.print(templateContent); //把模板页面上的 ###text### 替换成 title 里的内容 templateContent = templateContent.replaceAll("###text###", title); System.out.print(templateContent); String fileame = fileName + ".html"; fileame = disrPath+"/" + fileame;// 生成的html文件保存路径。 FileOutputStream fileoutputstream = new FileOutputStream(fileame);// 建立文件输出流 System.out.print("文件输出路径:"); System.out.print(fileame); byte tag_bytes[] = templateContent.getBytes(); fileoutputstream.write(tag_bytes); fileoutputstream.close(); } catch (Exception e) { System.out.print(e.toString()); } } } 2.模板页<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>Title</title> </head> </head> <body> ###text### </body> </html>3.生成的html<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>Title</title> </head> </head> <body> <h2>哈哈</h2> </body> </html>
2021年12月08日
227 阅读
0 评论
0 点赞
2021-12-08
java.lang.IllegalStateException: Failed to load property source from location 'classpath:/applicatio
异常问题:java.lang.IllegalStateException: Failed to load property source from location 'classpath:/application.yml' 可能是application.yml文件内容格式或层级的问题
2021年12月08日
291 阅读
0 评论
0 点赞
2021-12-08
java 最简单的xml与json相互转换
导入依赖 <!--xml转换--> <dependency> <groupId>com.fasterxml.jackson.dataformat</groupId> <artifactId>jackson-dataformat-xml</artifactId> <version>2.9.8</version> <scope>compile</scope> </dependency> 工具类 import com.alibaba.fastjson.JSONObject; import com.fasterxml.jackson.dataformat.xml.XmlMapper; import java.util.logging.Logger; /** * json对象或字符串转xml * @Author: LiuYong * @Date:2019/12/11 11:21 * @Description: TODO json对象或字符串转xml */ public class JsonAndXmlUtils { private static Logger logger = Logger.getLogger(JsonAndXmlUtils.class.getName()); public static void main(String[] args) throws Exception { String jsonInput = "{\"nonce_str\":\"b927722419c52622651a871d1d9ed8b2\",\"device_info\":\"1000\",\"out_trade_no\":\"1405713376\",\"appid\":\"wx2421b1c4370ec43b\",\"total_fee\":\"1\",\"sign\":\"3CA89B5870F944736C657979192E1CF4\",\"trade_type\":\"JSAPI\",\"attach\":\"att1\",\"body\":\"JSAPI支付测试\",\"mch_id\":\"10000100\",\"notify_url\":\"http://wxpay.weixin.qq.com/pub_v2/pay/notify.php\",\"spbill_create_ip\":\"127.0.0.1\"}\n"; String jsonToXml = JsonAndXmlUtils.jsonToXml(jsonInput); System.out.println("jsonToXml:"+jsonToXml); JSONObject jsonObject = xmlToJson(jsonToXml); System.out.println("xmlToJson:"+jsonObject.toJSONString()); } /** * xml字符串转json对象 * @Author LiuYong * @Date 2019/12/11 11:40 * @Description TODO xml字符串转json对象 * @param xmlStr * @return JSONObject **/ public static JSONObject xmlToJson(String xmlStr){ XmlMapper xmlMapper = new XmlMapper(); JSONObject jsonObject1=null; try{ jsonObject1 = xmlMapper.readValue(xmlStr, JSONObject.class); }catch (Exception e){ logger.info("ERROR com.slf.utils.utils.JsonAndXmlUtils.xmlToJson 异常:"+e.getMessage()); } return jsonObject1; } /** * json字符串转xml字符串 * @Author LiuYong * @Date 2019/12/11 11:45 * @Description TODO json字符串转xml字符串 * @param json * @return String **/ public static String jsonToXml(String json){ JSONObject jsonObject = JSONObject.parseObject(json); XmlMapper xmlMapper = new XmlMapper(); String s = null; try{ s = xmlMapper.writeValueAsString(jsonObject); }catch (Exception e){ logger.info("ERROR com.slf.utils.utils.JsonAndXmlUtils.jsonToXml 异常:"+e.getMessage()); } return s; } }
2021年12月08日
190 阅读
0 评论
0 点赞
2021-12-08
centos安装mosquitto支持websocket
下载libwebsocketshttps://github.com/warmcat/libwebsockets/archive/v1.5-chrome47-firefox41.tar.gz安装基础软件yum install gcc-c++ yum install cmake yum install openssl-devel //mosquitto默认支持openssl解压、编译、安装libwebsockets tar zxvf libwebsockets-1.5-chrome47-firefox41.tar.gz cd libwebsockets-1.5-chrome47-firefox41 mkdir build cd build cmake .. make make install安装mosquittoyum install mosquitto修改配置文件mv /etc/mosquitto/mosquitto.conf.example /etc/mosquitto/mosquitto.conf# ================================================================= # General configuration # ================================================================= # 客户端心跳的间隔时间 #retry_interval 20 # 系统状态的刷新时间 #sys_interval 10 # 系统资源的回收时间,0表示尽快处理 #store_clean_interval 10 # 服务进程的PID #pid_file /var/run/mosquitto.pid # 服务进程的系统用户 user root # 客户端心跳消息的最大并发数 #max_inflight_messages 10 # 客户端心跳消息缓存队列 #max_queued_messages 100 # 用于设置客户端长连接的过期时间,默认永不过期 #persistent_client_expiration # ================================================================= # Default listener # ================================================================= # 服务绑定的IP地址 #bind_address # 服务绑定的端口号 port 1883 listener 9001 protocol websockets # 允许的最大连接数,-1表示没有限制 #max_connections -1 # cafile:CA证书文件 # capath:CA证书目录 # certfile:PEM证书文件 # keyfile:PEM密钥文件 #cafile #capath #certfile #keyfile # 必须提供证书以保证数据安全性 #require_certificate false # 若require_certificate值为true,use_identity_as_username也必须为true #use_identity_as_username false # 启用PSK(Pre-shared-key)支持 #psk_hint # SSL/TSL加密算法,可以使用“openssl ciphers”命令获取 # as the output of that command. #ciphers # ================================================================= # Persistence # ================================================================= # 消息自动保存的间隔时间 #autosave_interval 1800 # 消息自动保存功能的开关 #autosave_on_changes false # 持久化功能的开关 persistence true # 持久化DB文件 #persistence_file mosquitto.db # 持久化DB文件目录 #persistence_location /var/lib/mosquitto/ # ================================================================= # Logging # ================================================================= # 4种日志模式:stdout、stderr、syslog、topic # none 则表示不记日志,此配置可以提升些许性能 log_dest none # 选择日志的级别(可设置多项) #log_type error #log_type warning #log_type notice #log_type information # 是否记录客户端连接信息 #connection_messages true # 是否记录日志时间 #log_timestamp true # ================================================================= # Security # ================================================================= # 客户端ID的前缀限制,可用于保证安全性 #clientid_prefixes # 允许匿名用户 allow_anonymous false # 用户/密码文件,默认格式:username:password password_file /etc/mosquitto/pwfile.example # PSK格式密码文件,默认格式:identity:key #psk_file # pattern write sensor/%u/data # ACL权限配置,常用语法如下: # 用户限制:user <username> # 话题限制:topic [read|write] <topic> # 正则限制:pattern write sensor/%u/data # 配置topic和用户 acl_file /etc/mosquitto/aclfile # ================================================================= # Bridges # ================================================================= # 允许服务之间使用“桥接”模式(可用于分布式部署) #connection <name> #address <host>[:<port>] #topic <topic> [[[out | in | both] qos-level] local-prefix remote-prefix] # 设置桥接的客户端ID #clientid # 桥接断开时,是否清除远程服务器中的消息 #cleansession false # 是否发布桥接的状态信息 #notifications true # 设置桥接模式下,消息将会发布到的话题地址 # $SYS/broker/connection/<clientid>/state #notification_topic # 设置桥接的keepalive数值 #keepalive_interval 60 # 桥接模式,目前有三种:automatic、lazy、once #start_type automatic # 桥接模式automatic的超时时间 #restart_timeout 30 # 桥接模式lazy的超时时间 #idle_timeout 60 # 桥接客户端的用户名 #username # 桥接客户端的密码 #password # bridge_cafile:桥接客户端的CA证书文件 # bridge_capath:桥接客户端的CA证书目录 # bridge_certfile:桥接客户端的PEM证书文件 # bridge_keyfile:桥接客户端的PEM密钥文件 #bridge_cafile #bridge_capath #bridge_certfile #bridge_keyfile修改文件mv /etc/mosquitto/aclfile.example /etc/mosquitto/aclfileuser test topic read test/# topic write test/# # This affects access control for clients with no username. topic read $SYS/# # This only affects clients with username "roger". user roger topic foo/bar # This affects all clients. pattern write $SYS/broker/connection/%c/state配置用户名和密码groupadd mosquitto useradd -g mosquitto mosquitto添加启动用户(默认mosquitto用户启动)groupadd mosquitto useradd -g mosquitto mosquitto后台启动mosquitto -c /etc/mosquitto/mosquitto.conf -d如果报错查看命令所在目录find / -name mosquitto复制命令到对应文件夹cp mosquitto /usr/local/sbin/
2021年12月08日
168 阅读
0 评论
0 点赞
2021-12-08
Spring Boot 整合之模板引擎(jsp、Freemarker 、Thymeleaf )
整合JSP模板 添加依赖创建 maven 工程,在 pom.xml 文件中添加如下依赖:<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency> <dependency> <groupId>org.apache.tomcat.embed</groupId> <artifactId>tomcat-embed-jasper</artifactId> </dependency>创建目录和配置文件1. JSP页面放在:/src/main/webapp/WEB-INF/jsp/目录下(webapp/WEB-INF/jsp 没有就自己创建),如:/src/main/webapp/WEB-INF/jsp/index.jsp 2. CSS或JavaScript之类的静态文件:/src/main/resources/static/目录下,如:/src/main/resources/static/css/main.css 3. 对于属性文件放在:/src/main/resources/目录下,如:/src/main/resources/application.properties 配置application.properties只需要添加这2个就可以了,如下: #页面默认前缀目录spring.mvc.view.prefix=/WEB-INF/jsp/#页面默认后缀目录spring.mvc.view.suffix=.jsp 或在application.yml中:spring节点下面: spring: mvc: view: prefix: /WEB-INF/jsp/ suffix: .jsp 创建JSP页面文件夹在src/main/webapp中的WEB-INF/下创建jsp文件夹,用于存放jsp页面文件。 <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <br> ${map} </body> </html> 编写Controllerpackage club.lygangdai.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Map; /** * @author Uncle Liu * @ClassName: TestController * @Description: TODO(类说明 :) * @date 2018/11/7 11:31 */ @Controller @RequestMapping("/jsp") public class TestController { @RequestMapping("/index") public String hello(Map<String,Object> map) { map.put("map", "Hell"); return "index"; } }结果如下: 整合Freemarker 模板添加 Freemarker 依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-freemarker</artifactId> </dependency> 添加 Freemarker 模板配置在 application.properties 中添加如下内容:spring.freemarker.allow-request-override=false spring.freemarker.cache=true spring.freemarker.check-template-location=true spring.freemarker.charset=UTF-8 spring.freemarker.content-type=text/html spring.freemarker.expose-request-attributes=false spring.freemarker.expose-session-attributes=false spring.freemarker.expose-spring-macro-helpers=false spring.freemarker.prefix= spring.freemarker.suffix=.ftl上述配置都是默认值。编写Controllerpackage club.lygangdai.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Map; /** * @author Uncle Liu * @ClassName: FreemarkerController * @Description: TODO(类说明 :) * @date 2018/11/7 11:32 */ @Controller @RequestMapping("/freemarker") public class FreemarkerController{ @RequestMapping("/hello") public String hello(Map<String,Object> map) { map.put("map", "Hell Freemarker"); return "freemarker"; } }在 templates 目录中创建名为 freemarker .ftl 文件,内容如下:<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8"> <title>Document</title> <link href="/css/index.css" rel="stylesheet"/> </head> <body> <div class="container"> <h2>${map}</h2> </div> </body> </html>结果如下:整合Thymeleaf 模板添加 Thymeleaf依赖<!--thymeleaf--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency>添加 Thymeleaf模板配置在 application.properties 中添加如下内容:#thymeleaf模板 spring.thymeleaf.cache=true spring.thymeleaf.prefix=classpath:/templates/ spring.thymeleaf.suffix=.html spring.thymeleaf.mode=HTML5 spring.thymeleaf.encoding=UTF-8 spring.thymeleaf.servlet.content-type=text/html上述配置都是默认值。编写Controllerpackage club.lygangdai.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import java.util.Map; @Controller @RequestMapping("thymeleaf") public class ThymeleafController { @RequestMapping("thymeleaf") public String hello(Map<String,Object> map) { map.put("map", "Hello Thymeleaf"); return "thymeleaf"; } }在 templates 目录中创建名为 thymeleaf.html 文件,内容如下:<!DOCTYPE html> <html lang="en" xmlns:th="http://www.w3.org/1999/xhtml"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h2 th:text="${map}"></h2> </body> </html>结果如下:
2021年12月08日
250 阅读
0 评论
0 点赞
2021-12-08
Spring Boot 整合之Fastjson
1.导入依赖<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.51</version> </dependency> 2.创建管理类WebConfig@Configuration public class WebConfig { @Bean public HttpMessageConverters fastJsonHttpMessageConverters() { FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter(); FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat); fastJsonHttpMessageConverter.setFastJsonConfig(fastJsonConfig); HttpMessageConverter<?> converter = fastJsonHttpMessageConverter; return new HttpMessageConverters(converter); } }3.创建测试实体类public class Test_Table { private Integer id; private String username; private Date birthday; }getter 和 setter 此处省略。4.创建Controller@Controller @RequestMapping("fastjson") public class FastJsonController{ @RequestMapping("/test") @ResponseBody public Test_Table test() { Test_Table test_table = new Test_Table(); test_table.setId(1); test_table.setUsername("汤姆"); test_table.setBirthday(new Date()); return test_table; } }结果如下:乱码,在@RequestMapping添加 @RequestMapping(value = "/test",produces="text/html;charset=UTF-8") 日期是毫秒数,我们在 User 类中使用 Fastjson 的注解,如下内容: @JSONField(format="yyyy-MM-dd HH:mm:ss") private Date birthday;再次测试,结果如下: 当日期格式与我们修改的内容格式一致,说明 Fastjson 整合成功。
2021年12月08日
226 阅读
0 评论
0 点赞
2021-12-08
Spring Boot 使用WebSocket(一)
依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> 创建服务器端点:对于 WebSocket 的使用,可以先通过 Spring 创建 Java 配置文件。在这个文件 中, 先新建 ServerEndpointExporter 对象 , 通过它可以定义 WebSocket 服务器的端点 , 这样客户端就能请求服务器 的端点,其内容如代码清单,有了这个 Bean ,就可以使用@ServerEndpoint 定义一个端点服务类。在这个站点服务类中,还可以定义 WebSocket 的打开 、关闭 、错误和发送消息的方法。package com.demo.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.socket.server.standard.ServerEndpointExporter; @Configuration public class WebSocketConfig { @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } } 创建webSocket:WebSocket是类似客户端服务端的形式(采用ws协议),那么这里的WebSocketServer其实就相当于一个ws协议的Controller直接@ServerEndpoint("/websocket")@Component启用即可,然后在里面实现@OnOpen,@onClose,@onMessage, @OnError等方法package com.demo.config; import org.springframework.stereotype.Service; import javax.websocket.*; import javax.websocket.server.PathParam; import javax.websocket.server.ServerEndpoint; import java.io.IOException; import java.util.concurrent.CopyOnWriteArraySet; @ServerEndpoint("/ws/{sid}") @Service public class WebSocket { /** * 这里稍微解释一下这些主要注解的作用 。 * • @ServerEndpoint("/ws") : * 表示让 Spring 创建 WebSocket 的服务端点 ,其中请求地址是“/ws”。 * • @OnOpen: * 标注客户端打开 WebSocket 服务端点调用方法。 * • @OnClose : * 标注客户端关 闭 WebSocket 服务端点调用方法。 * • @OnMessage : * 标注客户端发送消息, WebSocket 服务端点调用方法。 * • @OnError: * 标注客户 端请求 WebSocket 服务端点发生异常调用 方法。 * 因为每一个客户端打开时,都会为其创建一个 WebSocket 对象,所以这里的打开方 * 法中都会去计数并且将这个对象保存到 CopyOnWriteArraySet 中,这样就可以知道拥有多少连接。对 * 于关 闭方法则是清除这个对象,并且计数减一。对于消息发送方法 ,则是通过轮询对所有的客户端 * 连接都给予发送消息,所以所有的连接都可以收到这个消息。但是有时候可能只 是需要发送给特定13.4 WebSocket 应用 309 * 的用户,则需要得到用户的信息,然后再发送给特定的用户 。 */ /**静态变量,用来记录当前在线连接数 。 应该把它设计成线程安全的*/ private static int onlineConunt = 0; /**连接标识编号*/ private String sid=""; /**oncurrent 包的线程安全 Set ,用来存放每个客户端对应的 WebSocketServiceimpl 对象*/ private static CopyOnWriteArraySet<WebSocket> webSocketSet = new CopyOnWriteArraySet<>(); /**与某个客户端的连接会话,需要通过它来给客户端发送数据*/ private Session session; /** 连接建立成功调用的方法 */ @OnOpen public void onOpen(Session session, @PathParam("sid")String sid ){ this.sid=sid; this.session = session; //加入 set 中 webSocketSet.add(this); //在线数加1 addOnlineCount(); System.out.println("有新连接加入!"+sid+"当前在线人数为:"+getOnlineConunt()); try { sendMessage("有新的连接加入了!!"); } catch (IOException e) { System.out.println("IO异常"); } } //连接关闭调用的方法 @OnClose public void onClose(){ //从set中删除 webSocketSet.remove(this); //在线数减1 subOnlineCount(); System.out.println("有一连接关闭!当前在线人数为:"+getOnlineConunt()); } /** * 收到客户端消息后调用的方法 * @param message 客户端发送过来的消息 * @param session */ @OnMessage public void onMessage(String message,Session session){ System.out.println("来自客户端的消息:"+message); //群发消息 for(WebSocket item : webSocketSet){ //获取当前用户名称 try { item.sendMessage(message); } catch (IOException e) { System.out.println("发送消息异常"); } } } //发送错误时调用 @OnError public void onError(Session session,Throwable error){ System.out.println("发送错误"); error.printStackTrace(); } /** * 根据编号给指定客户端发送消息 * @param message 客户端消息 * @throws IOException */ public static void appointMessage(String message,String sid) throws IOException { for(WebSocket item : webSocketSet){ if(item.getSid().equals(sid)){ item.sendMessage(message); } } } /** * 发送消息 * @param message 客户端消息 * @throws IOException */ private void sendMessage(String message) throws IOException { this.session.getBasicRemote().sendText(message); } //返回在线数 private static synchronized int getOnlineConunt() { return onlineConunt; } //当连接人数增加时 private static synchronized void addOnlineCount() { WebSocket.onlineConunt ++; } //当连接人数减少时 private static synchronized void subOnlineCount() { WebSocket.onlineConunt --; } public String getSid() { return sid; } public void setSid(String sid) { this.sid = sid; } } 前端界面:<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script> <script type="text/javascript"> var ws = null; if('WebSocket' in window){ alert("你的浏览器支持 WebSocket"); ws = new WebSocket("ws://192.168.0.142:8080/ws/123"); } else { alert('你的浏览器不支持webSocket'); } //建立成功建立的回调方法 ws.onopen = function(event){ alert("消息已发送") appendMessage("open"); } //接收到消息的回调方法 ws.onmessage = function(event){ alert("接收到服务端发的消息") appendMessage(event.data); } //连接关闭的回调方法 ws.onclose = function(){ alert("连接已关闭") appendMessage("close"); } //连接发送错误的回调方法 ws.onerror = function(){ alert("连接发送错误") appendMessage("error"); } //监听窗口关闭事件,当窗口关闭时,主动关闭webSocket连接 //防止连接还没断开就关闭窗口,server端会抛异常 ws.onbeforeunload = function(){ alert("窗口关闭了,关闭socket连接") ws.onclose(); } //将消息显示在网页上 function appendMessage(message){ var context = $("#context").html() +"<br/>" +message; $("#context").html(context); } //关闭连接 function closeWebSocket(){ ws.close(); } //发送消息 function sendMessage(){ var message = $("#message").val(); ws.send(message); } </script> </head> <body> <input id="message" type="text"/> <button onclick="sendMessage()" >发送消息</button> <button onclick="closeWebSocket()" >关闭连接</button> <div id="context"></div> </body> </html>
2021年12月08日
219 阅读
0 评论
0 点赞
2021-12-08
The dependencies of some of the beans in the application context form a cycle:
SpringBoot多数据源启动项目报错:*************************** APPLICATION FAILED TO START *************************** Description: The dependencies of some of the beans in the application context form a cycle: sysJobController (field private com.comet.service.ISysJobService com.comet.controller.SysJobController.sysJobService) ↓ sysJobServiceImpl (field private com.comet.mapper.SysJobMapper com.comet.service.impl.SysJobServiceImpl.sysJobMapper) ↓ sysJobMapper defined in file [G:\IdeaProject\comet\comet-quartz\target\classes\com\comet\mapper\SysJobMapper.class] ↓ sqlSessionFactory defined in class path resource [org/mybatis/spring/boot/autoconfigure/MybatisAutoConfiguration.class] ┌─────┐ | dynamicDataSource defined in class path resource [com/comet/config/DataSourceConfig.class] ↑ ↓ | masterDataSource defined in class path resource [com/comet/config/DataSourceConfig.class] ↑ ↓ | org.springframework.boot.autoconfigure.jdbc.DataSourceInitializerInvoker └─────┘解决方式:在启动类添加(exclude = { DataSourceAutoConfiguration.class })
2021年12月08日
1,431 阅读
1 评论
0 点赞
2021-12-08
Spring Cloud 集成 WebHook
1.配置 WebHook 地址登录 GitHub,点击 GitHub 的 WebHook 菜单,右侧面板中 Payload URL 填写 <配置中心 url>/actuator/bus-refresh, Content-type 选择 applicaton/json,保存即可。因为需要用到外网,这里使用natapp外网穿透做外网映射设置 WebHook 操作: 2.修改config-server添加:import org.springframework.stereotype.Component;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.ByteArrayInputStream;import java.io.IOException;@Componentpublic class WebHookFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpServletRequest = (HttpServletRequest) request; String url = new String(httpServletRequest.getRequestURI()); // 只过滤 /actuator/bus-refresh 请求 if (!url.endsWith("/actuator/bus-refresh")) { chain.doFilter(request, response); return; } // 使用 HttpServletRequest 包装原始请求达到修改 post 请求中 body 内容的目的 CustometRequestWrapper requestWrapper = new CustometRequestWrapper(httpServletRequest); chain.doFilter(requestWrapper, response); } @Override public void destroy() { } private class CustometRequestWrapper extends HttpServletRequestWrapper { public CustometRequestWrapper(HttpServletRequest request) { super(request); } @Override public ServletInputStream getInputStream() throws IOException { byte[] bytes = new byte[0]; ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); return new ServletInputStream() { @Override public boolean isFinished() { return byteArrayInputStream.read() == -1 ? true : false; } @Override public boolean isReady() { return false; } @Override public void setReadListener(ReadListener readListener) { } @Override public int read() throws IOException { return byteArrayInputStream.read(); } }; } } } 3.测试 完成以上配置后,重启项目 修改github文件 再执行 http://localhost/test/getConfigInfo 因为网络原因,等几秒钟加载几次就能拉去新的数据了
2021年12月08日
176 阅读
0 评论
0 点赞
1
...
3
4