Categories
java

jwt token 和 sa-token

JWTSa-Token在功能、使用场景和优缺点等方面存在显著差异。

功能和适用场景

  • JWT‌:JWT是一种无状态令牌协议标准(RFC 7519),主要用于在网络间安全传递声明(Claims)。其核心特点包括无状态性、自包含结构(Header.Payload.Signature三段式编码)和跨域支持,特别适合分布式系统和跨服务认证‌1。JWT通常用于身份验证和信息交换,特别是在无状态的客户端-服务器通信中。由于其简洁和标准化的特点,JWT可以与各种语言和技术栈配合使用,提高系统的灵活性和可扩展性‌2。
  • Sa-Token‌:这是一款轻量级权限认证框架,专注于解决系统的登录认证、权限管理、会话管理等安全问题。其核心特点包括有状态会话管理(基于服务端存储会话,如Redis)、开箱即用的API(提供注解式鉴权、踢人下线、单点登录等功能)和多存储适配(支持Redis、Memcached、数据库等会话存储方式)‌12。Sa-Token提供了丰富的权限相关注解,支持多种条件组合,如AND、OR逻辑关系,以及复杂的表达式,适合需要快速开发和易于维护的项目‌2。

优缺点对比

  • JWT‌:
    • 优点‌:无状态性减少了服务器的存储压力,提高了系统的可扩展性和跨域支持;自包含结构使得令牌本身包含所有必要信息,无需服务端存储;简洁和标准化使其与各种语言和技术栈兼容‌12。
    • 缺点‌:需要自行实现令牌黑名单机制以实现踢人功能;由于信息自包含,令牌体积较大,可能会影响传输效率‌13。
  • Sa-Token‌:
    • 优点‌:提供丰富的权限相关注解和功能,支持多种存储方式,适合快速开发和易于维护的项目;开箱即用的体验简化了权限认证的集成和使用过程‌12。
    • 缺点‌:有状态会话管理增加了服务器的存储压力;虽然功能丰富,但在高度定制化安全策略方面可能不如Spring Security灵活‌2。
Categories
java

若依 本地docker部署

Dockerfile :

FROM  docker.1ms.run/openjdk:8

MAINTAINER Robin Luo

RUN mkdir -p /ruoyi/server/logs \
    /ruoyi/server/temp \
    /ruoyi/skywalking/agent

WORKDIR /ruoyi/server

ENV SERVER_PORT=8080

EXPOSE ${SERVER_PORT}

ADD ./ruoyi-admin.jar ./app.jar

ENTRYPOINT ["java", \
            "-Djava.security.egd=file:/dev/./urandom", \
            "-Dserver.port=${SERVER_PORT}", \
            # 应用名称 如果想区分集群节点监控 改成不同的名称即可
#            "-Dskywalking.agent.service_name=ruoyi-server", \
#            "-javaagent:/ruoyi/skywalking/agent/skywalking-agent.jar", \
            "-jar", "app.jar"]

docker-compose.yaml

version: '3.8'
services:
  ruoyi-his-server:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: ruoyi-his-server
    ports:
      - "8009:8080"
    environment:
      - SPRING_PROFILES_ACTIVE=druid,dev
    restart: always

再该目录下 执行 docker-compose up -d 启动服务

执行 dock-compose down 停止服务

Categories
java

DWR

DWR 全称 direct web remote

可将java的一个对象当成js一个对象执行方法返回结果

可以理解为js域通向java服务端的一种RPC(远程方法调用)

技术执行流 为 js-> js 对象执行方法-> post 异步请求->DWRServlet->java 对象

中间post 异步请求与 DWRServlet 均被封装屏蔽

用户只需要调用DWRServlet 动态生成的js脚本里面生成的js对象的方法 就可以发起通讯

Categories
java

gradle compile tree

gradle import local jar as dependency

dependencies{
// 依赖某个jar文件
implementation files(‘lib/xxx.jar’)


// 依赖libs目录下所有以.jar结尾的文件
implementation fileTree(dir: ‘lib’, include: [‘.jar’])

// 依赖libs目录下除了xxx.jar以外的所有以.jar结尾的文件 implementation fileTree(dir: ‘lib’, exclude: [‘xxx.jar’], include: [‘.jar’])

}

Categories
java

aliyun maven

仓库名称阿里云仓库地址阿里云仓库地址(老版)源地址
centralhttps://maven.aliyun.com/repository/centralhttps://maven.aliyun.com/nexus/content/repositories/centralhttps://repo1.maven.org/maven2/
jcenterhttps://maven.aliyun.com/repository/publichttps://maven.aliyun.com/nexus/content/repositories/jcenterhttp://jcenter.bintray.com/
publichttps://maven.aliyun.com/repository/publichttps://maven.aliyun.com/nexus/content/groups/publiccentral仓和jcenter仓的聚合仓
googlehttps://maven.aliyun.com/repository/googlehttps://maven.aliyun.com/nexus/content/repositories/googlehttps://maven.google.com/
gradle-pluginhttps://maven.aliyun.com/repository/gradle-pluginhttps://maven.aliyun.com/nexus/content/repositories/gradle-pluginhttps://plugins.gradle.org/m2/
springhttps://maven.aliyun.com/repository/springhttps://maven.aliyun.com/nexus/content/repositories/springhttp://repo.spring.io/libs-milestone/
spring-pluginhttps://maven.aliyun.com/repository/spring-pluginhttps://maven.aliyun.com/nexus/content/repositories/spring-pluginhttp://repo.spring.io/plugins-release/
grails-corehttps://maven.aliyun.com/repository/grails-corehttps://maven.aliyun.com/nexus/content/repositories/grails-corehttps://repo.grails.org/grails/core
apache snapshotshttps://maven.aliyun.com/repository/apache-snapshotshttps://maven.aliyun.com/nexus/content/repositories/apache-snapshotshttps://repository.apache.org/snapshots/

maven 版本

<repository>
  <id>spring</id>
  <url>https://maven.aliyun.com/repository/spring</url>
  <releases>
    <enabled>true</enabled>
  </releases>
  <snapshots>
    <enabled>true</enabled>
  </snapshots>
</repository>

gradle 版本

allProjects {
  repositories {
    maven {
      url 'https://maven.aliyun.com/repository/public/'
    }
    maven {
      url 'https://maven.aliyun.com/repository/spring/'
    }
    mavenLocal()
    mavenCentral()
  }
}
Categories
java Uncategorized

activiti todo

流程定义模块-> 设计-> 部署 删除

流程定义历史模块

流程实例模块

任务实例模块

Categories
java

spring activiti starter

<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M6</version>
</dependency>

注入activiti 组件


初始化activiti 表

以下单元测试用例 用来初始化 activiti 表
@SpringBootTest
class ActivitiApplicationTests {

    @Test
    void contextLoads() {
        ProcessEngineConfiguration processEngineConfiguration = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
        processEngineConfiguration.buildProcessEngine();
    }

}

activiti.cfg.xml 是在类目录下的 一个spring beans 配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans.xsd">


    <bean id="dataSource" class="com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper" >
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://mysql.robinluo.top/activiti?characterEncoding=UTF-8&amp;nullCatalogMeansCurrent=true&amp;serverTimezone=GMT&amp;useSSL=false" />
        <property name="username" value="admin" />
        <property name="password" value="RobinLuo@2021" />
    </bean>


    <bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
        <!-- ... -->
        <property name="databaseSchemaUpdate" value="true" />
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>
Categories
java

Druid Spring Starter

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>


自动注入druid datasource 
Categories
java

idea 技巧

当命令行过长

在.idea/workspaces.xml中

修改

<component name=”propertiesComponent”>

<properties name=”dynamic.classpath” value=”true” />

</component>

Categories
java

spring cloud gateway

spring cloud gateway 是微服务常用网关

网关转发语法

application.properties


spring.cloud.gateway.routes[0].id=url-proxy
spring.cloud.gateway.routes[0].predicates[0]=Path=/**
spring.cloud.gateway.routes[0].uri=http://www.baidu.com
spring.cloud.gateway.routes[0].order=1000000



spring.cloud.gateway.routes[1].id=eureka
spring.cloud.gateway.routes[1].predicates[0]=Host=eureka.robinluo.top
spring.cloud.gateway.routes[1].uri=http://localhost:8765
spring.cloud.gateway.routes[1].order=10000

order 越小 优先级越大

predicates 语法:

After=2018-01-20T06:06:06+08:00[Asia/Shanghai]

请求时间过滤 之后

Before=2018-01-20T06:06:06+08:00[Asia/Shanghai]

请求时间过滤 之前

Between=2018-01-20T06:06:06+08:00[Asia/Shanghai], 2019-01-20T06:06:06+08:00[Asia/Shanghai]

请求时间之间

Cookie=ityouknow, kee.e

cookie 匹配

Header=X-Request-Id, \d+

header 匹配

Host=**.ityouknow.com

域名匹配

Method=GET

请求方式匹配

Path=/foo/{segment}

访问路径匹配

Query=smile

请求参数匹配

RemoteAddr=192.168.1.1/24

ip地址匹配

代码分析

所有predicate 都是继承自org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory 接口的实现类

After = AfterRoutePredicateFactory

Before = BeforeRoutePredicateFactory

Between = BetweenRoutePredicateFactory

Cookie = CookieRoutePredicateFactory

Header = HeaderRoutePredicateFactory

Host = HostRoutePredicateFactory

Method = MethodRoutePredicateFactory

Path = PathRoutePredicateFactory

ReadBody = ReadBodyRoutePredicateFactory

Query = QueryRoutePredicateFactory

RemoteAddr = RemoteAddrRoutePredicateFactory

Weight = WeightRoutePredicateFactory

PredicateSpec 有所有配置语法