一、整合jasypt加密

Github:https://github.com/jasypt/jasypt

引入依赖:

        <dependency>
            <groupId>com.github.ulisesbocchio</groupId>
            <artifactId>jasypt-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>

配置加解密密钥:

jasypt:
  encryptor:
    password: 123456

加解密算法也可通过jasypt.encryptor.algorithm配置替换

加解密测试:

    @Test
    public void encryptPwd() {
        //加密
        String username = stringEncryptor.encrypt("root");
        System.out.println("加密username: " + username);

        String decUsername = stringEncryptor.decrypt(username);
        System.out.println("解密username: " + decUsername);

        //加密
        String password = stringEncryptor.encrypt("123456");
        System.out.println("password: " + password);
        String decPassword = stringEncryptor.decrypt(password);
        System.out.println("解密password: " + decPassword);
    }

输出:

加密username: QAW910RdluxFpY12P0GDWNbTMKXvTfIShae2RjvfgrYBAWLqzkQ9uhoOSC2QUb1+
解密username: root
password: Rhs5qTmEyQ2Rxa0NNyPwaWiAqDhEU/NLgvMdtido0PdaBmxTouRE7wsUvIVZOVOs
解密password: 123456

将配置文件里需要加密的数值替换ENC(加密字符串即可),前后缀ENC()可通过配置jasypt.encryptor.property.prefix:和jasypt.encryptor.property.suffix:修改。如数据库账号密码配置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/cms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai
    #username:root password:root
    username: ENC(QAW910RdluxFpY12P0GDWNbTMKXvTfIShae2RjvfgrYBAWLqzkQ9uhoOSC2QUb1+)
    password: ENC(QAW910RdluxFpY12P0GDWNbTMKXvTfIShae2RjvfgrYBAWLqzkQ9uhoOSC2QUb1+)

 二、整合websocket

1、websocket简介

  WebSocket协议是由HTML5定义的,基于TCP协议实现的一种网络协议,通过该协议服务器可以主动向客户端发送信息;
  WebSocket 协议在2008年诞生,2011年成为W3C国际标准;
  我们已经有了 HTTP 协议,为什么出现一个websocket协议?
  http协议是短连接,因为请求之后,都会关闭连接,下次重新请求数据,需要再次打开链接;
  WebSocket协议是一种长连接,只需要通过一次请求来初始化连接,然后所有的请求和响应都是通过这个TCP连接进行通讯;
  所以HTTP协议通信只能是客户端向服务器发出请求,服务器返回响应结果,HTTP 协议做不到服务器主动向客户端推送信息,而websocket能实现服务器和客户端全双工通信

  何谓全双工

  信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工,信息能够同时双向传送则称为全双工;
  基本实现原理
  WebSocket协议基于TCP协议实现,客户端和服务器只需要做一个握手的动作之后,形成了一条基于客户端和服务器之间的快速通道,之后客户端与服务端之间便可以进行多次数据帧双向传输;
  这样实现的目的是客户端和服务器进行频繁双向通信时,可以使服务器避免频繁创建HTTP连接,节约资源,提高工作效率和资源利用率;

   WebSocket的特点

  • 全双工通信,客户端和服务器可以双向平等通信;
  • 建立在TCP协议之上,服务器端的实现比较容易;
  • 数据格式比较轻量,性能开销小,通信高效;
  • 可以发送文本,也可以发送二进制数据;
  • 通信具有更强的实时性;协议标识符是ws,服务器地址就是:ws://www.abc.com/some/path。http协议: http://

2、websocket业务场景

  • WebSocket聊天室;
  • 股票实时价格显示等应用;
  • 即时通讯、游戏、可视化大屏展示等领域;
  • 企业内部管理通讯等功能,主要通讯协议websocket;
  • web网页聊天、客服系统实现;
  • 系统提醒、用户上下线提醒、客户端同步,实时数据更新,多屏幕同步,用户在线状态,消息通知,扫描二维码登录/二维码支付,弹幕、各类信息提醒,在线选座,实时监控大屏等等

3、java中的websocket

  在Java EE 7中Java语言开始支持websocket协议,Java EE 7中定义了一套Websocket API规范,也就是一系列接口,没有实现,位于包javax.websocket下,包含客户端API和服务端API,WebSocket的Java API 只是规范,具体实现需要web容器(比如tomcat就实现了Java websocket api)、Java EE服务器或者框架提供;

1、Tomcat:java中的websocket实现,需要tomcat 7.0.47+以上才支持,Java EE7的支持;

2、Spring的websocket,需要Spring 4.x,所以springboot也可以用;

 4、websocket开发相关注解以及API方法

@ServerEndpoint("/websocket/{uid}")

  申明这是一个websocket服务;需要指定访问该服务的地址,在地址中可以指定参数,需要通过{}进行占位;

@OnOpen

  用法:public void onOpen(Session session, @PathParam("uid") String uid) throws IOException{}

  该方法将在建立连接后执行,会传入session对象,就是客户端与服务端建立的长连接通道,通过@PathParam获取url中声明的参数;

@OnClose

  用法:public void onClose() {}

  该方法是在连接关闭后执行;

@OnMessage

  用法:public void onMessage(String message, Session session) throws IOException {}

  该方法用于接收客户端发送的消息;
  message:发来的消息数据;
  session:会话对象(也是长连接通道);

session.getBasicRemote().sendText("hello,websocket.");

发送消息到客户端;通过session进行消息发送;

 5、前端对websocket的支持

Websocket是html5规范,主流浏览器都支持;(某些老浏览器不支持)jQuery、vueJS、React JS、angularjs等都可以支持webscoket对象;
底层是javascript支持的一个webscoket的js对象,通过这个对象可以建立websocket的连接:ws://localhost:8080/websocket/12345

 Websocket各浏览器的支持情况:https://caniuse.com/#search=websocket

使用范例:https://gitee.com/xiaodtest/springbootdemo.git