開發與維運

開發與維運

Spring OAuth2 學習整理

Spring OAuth2 學習整理 OAuth2 介紹 OAuth2是目前最流行的授權機制,用來授權第三方應用,獲取用戶數據。 博客提供的流程圖中有一點需要注意的是C步驟是用戶參與完成驗證,驗證之後Client拿到對應的Access Token 再進行後續操作.這時Client可以是第三方服務器或者瀏覽器js存儲. OAuth運行流程 說明 spring官方發佈了blog ,最新版的SpringSecurity已經不支持創建一個授權服務器,轉而提供一個標準的授權服務…. 下面的代碼是一個單項目,包含了授權服務,資源服務.使用mybatis-plus自定義了用戶信息查詢和客戶端信息查詢. 配置 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> […]

開發與維運

Jquery發送ajax請求

1.ajax $.ajax({ url:”http://www.microsoft.com”, //請求的url地址 dataType:”json”, //返回格式為json async:true,//請求是否異步,默認為異步,這也是ajax重要特性 data:{“id”:”value”}, //參數值 type:”GET”, //請求方式 beforeSend:function(data){ //請求前的處理 }, success:function(req){ //請求成功時處理 }, complete:function(data){ //請求完成的處理 },

開發與維運

高併發之——不得不說的線程池與ThreadPoolExecutor類淺析

大家好,我是冰河~~ 既然Java中支持以多線程的方式來執行相應的任務,但為什麼在JDK1.5中又提供了線程池技術呢?這個問題大家自行腦補,多動腦,肯定沒壞處,哈哈哈。。。 說起Java中的線程池技術,在很多框架和異步處理中間件中都有涉及,而且性能經受起了長久的考驗。可以這樣說,Java的線程池技術是Java最核心的技術之一,在Java的高併發領域中,Java的線程池技術是一個永遠繞不開的話題。既然Java的線程池技術這麼重要(怎麼能說是這麼重要呢?那是相當的重要,那傢伙老重要了,哈哈哈),那麼,本文我們就來簡單的說下線程池與ThreadPoolExecutor類。至於線程池中的各個技術細節和ThreadPoolExecutor的底層原理和源碼解析,我們會在【高併發專題】專欄中進行深度解析。 引言:本文是高併發中線程池的開篇之作,就暫時先不深入講解,只是讓大家從整體上認識下線程池中最核心的類之一——ThreadPoolExecutor,關於ThreadPoolExecutor的底層原理和源碼實現,以及線程池中的其他技術細節的底層原理和源碼實現,我們會在【高併發專題】接下來的文章中,進行死磕。 二、Thread直接創建線程的弊端 (1)每次new Thread新建對象,性能差。 (2)線程缺乏統一管理,可能無限制的新建線程,相互競爭,有可能佔用過多系統資源導致死機或OOM。 (3)缺少更多的功能,如更多執行、定期執行、線程中斷。 (4)其他弊端,大家自行腦補,多動腦,沒壞處,哈哈。 三、線程池的好處 (1)重用存在的線程,減少對象創建、消亡的開銷,性能佳。 (2)可以有效控制最大併發線程數,提高系統資源利用率,同時可以避免過多資源競爭,避免阻塞。 (3)提供定時執行、定期執行、單線程、併發數控制等功能。 (4)提供支持線程池監控的方法,可對線程池的資源進行實時監控。 (5)其他好處,大家自行腦補,多動腦,沒壞處,哈哈。 四、線程池 1.線程池類結構關係 線程池中的一些接口和類的結構關係如下圖所示。 後文會死磕這些接口和類的底層原理和源碼。

開發與維運

Spring boot整合Activiti7

Activiti介紹 Activiti是一個輕量級的java開源BPMN 2工作流引擎.目前以升級至7.x,支持與springboot2集成. SpringBoot配置說明 pom.xml 增加activiti-spring-boot-starter並指定對應版本. <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter</artifactId> <version>7.1.0.M6</version> </dependency> <!– 指定數據源–> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> java配置 activiti-spring-boot默認集成了spring security用於權限管理如需禁用security啟動類中屏蔽ActivitiSpringIdentityAutoConfiguration,再增加一個配置類即可

開發與維運

Spring Security 配置多WebSecurityConfigurerAdapter

Spring Security多入口 官方為了方便演示使用的是一個主類,兩個內部類來實現的多入口,下面的例子將其拆分為兩個配置類,兩個用戶方便理解. 配置 @Configuration public class FormSecurityConfig extends WebSecurityConfigurerAdapter { @Bean public static PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder();

開發與維運

Spring boot 2.x 整合Spring-Statemachine

狀態機簡介 狀態機是一種用來進行對象行為建模的工具,其作用主要是描述對象在它的生命週期內所經歷的狀態序列,以及如何響應來自外界的各種事件,摘錄自這個大神的文章狀態機引擎選型 示例說明 網上能找到的示例大多都過於複雜,所以寫了一個簡單的示例下面的代碼定義了一個極簡的狀態機,僅包含兩個狀態(上班,下班),一個事件(通勤),通過web頁面操作添加狀態機及狀態轉換,集成了spring-statemachine-data-jpa進行持久化. SpringBoot2.x配置說明 Pom.xml <dependency> <groupId>org.springframework.statemachine</groupId> <artifactId>spring-statemachine-starter</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.statemachine</groupId> <artifactId>spring-statemachine-data-jpa</artifactId> <version>2.2.0.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>

開發與維運

一個簡單的代碼風格優化的小案例

一、背景 最近 review 了一些代碼,其中有一個函數的寫法看著彆扭,而且對應同學不太清楚還可以怎麼優化。由於案例比較典型,值得分享一下。 本文給出對應的偽代碼和自己的修改建議,並推薦可以提交代碼質量的圖書,以便能夠幫助大家養成良好的編碼風格。 二、偽代碼 public void doSomething(){ // 構造參數(後無空格) // 調用二方服務(後無空格) if(result.success && result.getXXXMap() != null && result.getXXXMap().get(“aaa”)

開發與維運

Spring Security 自定義認證

角色說明 CustomAuthenticationFilter:構建Token類並交給AuthenticationProvider進行驗證,繼承自AbstractAuthenticationProcessingFilter,AbstractAuthenticationProcessingFilter為UsernamePasswordAuthenticationFilter的父類,封裝了登陸過程用到的常用內容及方法.也可以不繼承此類完核心功能即可. CustomAuthenticationProvider:對支持的token進行校驗與shiro中Realm類似,區別是Security將授權與認證合併了. CustomAuthenticationToken:自定義token,存儲自定義內容,程序中使用SecurityContextHolder.getContext().getAuthentication()來獲取 java配置 過濾器配置 public class CustomAuthenticationFilter extends AbstractAuthenticationProcessingFilter { public CustomAuthenticationFilter() { super(new AntPathRequestMatcher(“/custom/**”)); // setContinueChainBeforeSuccessfulAuthentication(true); }

開發與維運

Spring boot 整合 cache,session,redis

例子簡介 將spring-cache,spring-session存儲配置為redis,並提供三個例子分別對應cache,session以及redisTemplate的讀寫操作,僅保留了核心代碼,其它配置請參考官方文檔. 配置 pom <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> application.properties # 使用redis存儲session spring.session.store-type=redis

開發與維運

java-Thread筆記

生命週期 相關方法 interrupt():實例方法將線程中斷標識設置為true,如線程在wait/sleep則報java.lang.InterruptedException interrupted():靜態方法,Thread.interrupted()重置當前線程中斷標識 isInterrupted(): 實例方法獲取當前線程中斷標識 join():中斷當前線程,等待調用線程結束後再執行 Thread.sleep(millis):當前線程休眠x毫秒,不釋放持有鎖 LockSupport.park():中斷當前線程,不釋放持有鎖 Object.wait(millis):當前線程等待x秒,不傳遞則無限期等待,釋放持有鎖 線程變量 ThreadLocal:同線程內共享,無法傳遞至子線程 生命週期:在設置第一個值時通過Thread.currentThread()與當前線程中threadLocals進行關聯,並初始化一個ThreadLocalMap進行存儲。 ThreadLocalMap中存儲內容的Entry使用的是WeakReference弱引用,便於垃圾回收。 在非線程池情況下由於key為弱引用在代碼中沒有繼續使用時(強引用去掉後只剩弱引用),會被gc回收.get方法會清理不存在的key對應的value,保障了內存回收 在線程池中使用時由於線程不會被回收,Thread這個強引用不會被清理,所以存在內存溢出風險。 可在使用完成之後通過remove方法清理來規避這個隱患。 使用static初始化時也存在生命週期過長存在內存溢出隱患 InheritableThreadLocal:只有在創建線程池時會初始化,所以線程池場景會導致賦值邏輯混亂 重寫了childValue(),getMap(Thread),createMap(Thread

Scroll to Top