知識學習綜合
一 WEB JAVA知識學習
1 JSON web tokens 身份認證 rest webservice的幾種方式
a: base64: username
b: 儲存shiro裡的sessionId, 每次都要回傳,有session共享問題(如果伺服器部署叢集的話)
c: jwt,每次都傳 固定的 json,無狀態的,支援叢集 http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
2 驗證碼自動生成總結
a;本質是個servlet,配置要寫在web.xml裡
b: 點選重新整理功能是 onclick='this.src='xxxxxx.do'+Math.random();' 記得去掉容易混淆字型
c:隨機重新整理的原理和後臺無關,怕是瀏覽器快取造成不重新整理,需要使用googole的外掛maven,可生成顏色,
位置,背景噪音橫條等
<img id="verificationcode" title="Click the refresh" src="xzzzzzzzzzimagecode?rnd=0.5650006300705059" width="116" height="36" onclick="this.src = 'http://aaaaaaaa/imagecode?rnd=' + Math.random(); ">
3 單點登入的設計思路:
如果不同則是 在其他裝置登入,如果沒有則是賬號過期,放在攔截器中處理,如果 需要實時的通知需要透傳,極光推送的自定義訊息(手機端程式)
4 spring 進行表單驗證 @Valid
使用基於xxx標準的註解方式 用到了c3p0,jboss等jar包,步驟是:
a: 使用Pojo類引入註解 Max Min, Size,Email, DecimalMax,DecimalMin xxxxxx
b: 主類中 @Validated pojo, BindingResult result xxxxx ,錯誤資料儲存,需要重新整理(有兩種方式類,另外一種是@valid Errors類,目前專案用來BindingResult),其中BindingResult 實現類Errors的方法
c :頁面展示, 重新跳轉到form頁,然後顯示了錯誤資訊,結合bootstrap的類,點一下後就會消失
5 使用驗證器驗證表單, InitBinder,第二功能:型別轉換
驗證器參考 databinder.setValidate(aaa class extends validator (實現validate方法,例如價格比較等邏輯驗證))
第二個功能:型別轉換,自動轉換時間的格式,int,double等,參考文章 https://www.cnblogs.com/heyonggang/p/6186633.html
6 刪除帶外來鍵的基礎資料方法
刪除帶外來鍵的基礎資料方式是先查詢時候有外來鍵資料有則刪除,最後刪基礎資料 其中delete的no action意思是刪資料的時候不自動刪被依賴的資料,需要手動刪除
7 spring boot路徑父路徑錯誤問題原因
spring boot 這樣用法不可行的原因
返回類當前路徑的方法:當前路徑都是classes層的下一層
path = new File(BlackmanService.class.getResource("/").getPath()).getParentFile().getParentFile().getParentFile().getCanonicalPath();
檢視路徑可知 路徑竟然是jar包路徑,當然路徑不正確了, springboot和 tomcat專案完全不同,tomcat的會解壓生成class而springboot則不會
file:/D:/workspaces_myeclipseci3/middleman/target/middleman-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/
java.io.IOException: 檔名、目錄名或卷標語法不正確。
at java.io.WinNTFileSystem.canonicalize0(Native Method)
8 springboot打包執行部署的方法
新增一個外掛,可以在外面配置配置檔案可以修改
<!-- usage: mvn package spring-boot:repackage -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<mainClass>com.stelect.monitor.MonitorStart</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
9驗證資料的思路,需要去重新整理頁面
新增一個驗證,驗證修改總數,有錯誤會加上model.asMap.add,如果數量不等表示有錯,
如何判斷是否修改,調介面,再查資料庫如果值不同則設定名字有例如map.put(key,has),
驗證完了就判斷map如果有就說明需要修改至或者呼叫
10 多執行緒資料的問題,不一定需要 等待,因為是多執行緒,才加,單執行緒不需要的
package com.hbean.btlcloud.webservice;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
public class TestG {
public static void main(String[] args) {
restThread restThread = new restThread();
ResponseBean responseBean = new ResponseBean();
ExecutorService executor = Executors.newCachedThreadPool();
try {
Future<ResponseBean> future = executor.submit(restThread);
System.out.println(future.get().name);
Thread.sleep(1000);
// executor.shutdown();
// executor.awaitTermination(10, TimeUnit.SECONDS);
}
catch (Exception e) {
}
}
}
class ResponseBean{
int name;
ResponseBean(){}
ResponseBean(int name){this.name=name;}
}
class restThread implements Callable<ResponseBean>{
@Override
public ResponseBean call() throws Exception {
Thread.sleep(3000);
return new ResponseBean(123);
}
}
11 myeclipse ci3 破解的方法
網上教程太多,都是正確的,老是錯誤是因為破解的 工具有問題,用下面的連結可以正確破解,親測可用
https://download.csdn.net/download/u014017819/9763883
12進入初始化也和初始化資料寫法技巧
初始化登入頁面用GET, 進行登入用POST,這樣就可以用同名的函式了,不會不好起名字
13 獲取當前請求路徑
最常用的 反倒是最好用的
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
14 如何理解<base href="<%=basePath%>"
參考文章:用於儲存相對路徑的,有了他就不需要別的路徑了,只能放在header裡面且不渲染
https://blog.csdn.net/johnstrive/article/details/37805463
15 暴力獲取 webcontext spring上下文的方法
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
UserAccountService userAccountService = (UserAccountService)wac.getBean("userAccountService");
18 使用group by語句裡的having 條件 切記 需要group by 裡面排序過,否則返回的都是空
17攔截器過濾 spring 使用 MethodInterceptor
可以攔截方法同時返回需要的引數型別 ,不可用注入但是可以自動注入 httpserveltrequest
19 Memcache的用法
1 telnet localhost 11211 telnet連線mem
2 get xxxx 獲取值
3 stats 查詢狀態
引數介紹
1、 以上的安裝和啟動都是在預設環境下進行的,在安裝時可設定如下引數:
-p 監聽的埠
-l 連線的IP地址, 預設是本機
-d start 啟動memcached服務
-d restart 重起memcached服務
-d stop|shutdown 關閉正在執行的memcached服務
-d install 安裝memcached服務
-d uninstall 解除安裝memcached服務
-u 以的身份執行 (僅在以root執行的時候有效)
-m 最大記憶體使用,單位MB。預設64MB
-M 記憶體耗盡時返回錯誤,而不是刪除項
-c 最大同時連線數,預設是1024
-f 塊大小增長因子,預設是1.25
-n 最小分配空間,key+value+flags預設是48
-h 顯示幫助
如:“memcached -d install -l 127.0.0.1 -m 1024 -c2048”。
https://github.com/memcached/memcached/wiki文件
21 three js
https://github.com/josdirksen/learning-threejs
22 圖片
background-color:rgba(0,0,0,0.6) 半透明背景
color :rgba(255,255,255)
22 spring boot 部署為舊的war 的方法
1)啟動類繼承 extends SpringBootServletInitializer,實現預設configure方法
2) 改包為war型別
3) 新增pom的tomcat依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
來源官網 85.1 章節:
23 jquery一些函式
xxx.toArray() 轉為 dom陣列
xxx.index(dom) 反查 索引號
add(xxx)新增附加同型別的 資料
24 Docker安裝和安裝tomcat
檢視centos核心版本
uname -r
教程:
安裝兩種方式 yum和 指令碼很清楚
安裝步驟
http://www.runoob.com/docker/centos-docker-install.html
安裝tomcat,啟動成功但是無法訪問
http://www.runoob.com/docker/docker-install-tomcat.html
docker run --name tomcat5 -p 8081:8081 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat
進不去需要啟動 裡面程式才可以,光啟動tomcat的image不管用
例如 docker exec -it tomcat5 bin/sh
瀏覽器訪問必須是 ip地址 用ifocnig -a已經無法檢視,而且tomcat的預設地址就是8080,哪怕外面的
對映都是為8081,都不是設定tomcat埠的
25 返回當前時間到第二天凌晨剩餘秒數,存於memcache中,因為發訊息需要每天只發一次
public static Long getSecondsNextEarlyMorning() {
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_YEAR, 1);
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.MILLISECOND, 0);
Long seconds = (cal.getTimeInMillis() - System.currentTimeMillis()) / 1000;
return seconds.longValue();
}
26 shiro 學習
shiro高階學習網站
https://www.w3cschool.cn/shiro/8tnc1if9.html
授權身份
oauth2 使用證照??? http://oauth.net/2/
日期的自動對映問題
shiro支援 ssl 就是 https ,需要配置證照,指定tomcat的證照路徑,和密碼同證照相同,預設8443
然後配置shiro的配置檔案即可
session依賴於cookie,cookie如果設定了有效期,則開啟同以頁面則cookie不刪除
spring處理異常 方法
@ExceptionHandler({UnauthorizedException.class})
shiro的rember me 和授權二選一
26_2 shiro搭建步驟
shiro分幾個功能模組,完全相互獨立一點一點來
第一是 攔截功能實現
新增web,新增shiro.xml, 新增 realm重寫的,如果需要動態獲取總攔截則要重寫 shiroFilter,裡面重寫setfilterChainDefinitions 方法,
高階功能
第二是登入後許可權的賦值和驗證
在realm裡面可以自己實現 AuthenticatingRealm 裡面的屬性 credentialsMatcher,重寫匹配器,如果不寫就會使用預設的驗證密碼問題
第三是 共享公共單點登入問題 自動修改許可權問題 (高階功能)
1 負責攔截器的攔截,如果失敗跳轉到某一個地方
2 單獨的攔截器
3 realm 一個新建user,從資料庫查,一個給user授權
AuthenticatingRealm 多級繼承問題
27 oauth2 例項程式碼
https://github.com/favccxx/FavOAuth2
oauth流程
1 四個角色, client申請獲取申請許可權,資源伺服器返回同意,
2 client用申請許可權 從驗證許可權獲取tokenaccess,認證伺服器返回token
3 client根據token 獲取資源
28 Game2.5d設計思路
1 背景圖 透明度慢慢變100,剛進入時
2 強關聯,弱分類,人物圖片規則是使用 序號,不寫死名字,路徑全用靜態變數代替,後臺有javaweb
3 先開放限制
29 配置阿里的映象 maven,解決了 jar包找不到的問題
<mirrors>
<mirror>
<id>alimaven</id>
<name>aliyun maven</name>
<url>
http://maven.aliyun.com/nexus/content/groups/public/
</url>
<mirrorOf>central</mirrorOf>
</mirror>
</mirrors>
offline 預設是false,就是說聯網的時候就下載,不用改
proxy 就是代理伺服器,為何用代理,第一是過濾,第二節省ip點
service 如果建立了私服會這樣來用的
30 kafka
保證插入mysql資料一致性,需要儲存 插入資料和呼叫資料返回結果 放於同一事務中
31 RequestContextListener 監聽器的作用
這個監聽器新增了 bean的 三個作用域 session. globalsessioni,request
32 搭建spring mvc的 小白搭建方法
https://www.cnblogs.com/xing901022/p/5240044.html
加上requestcontextlistener為了支援bean、的三個作用域 request,sessionxxx
servelt的mvc必須配置 psring-mvc.xml,重了也沒有關係,沒有的話會找預設的配置,估計會沒有,不加前字尾的將要 配置 controller用 responsebody,就好返回直接
的字串,類似於ajax返回值,否則是相當於跳轉,沒頁面就會沒空
搭建很簡單,先manven的web,載入jar包,複製三大塊在web.xml,配置兩個xml,裡面有掃描包和 試圖解析器,然後 寫頁面和controller即可
33 mysql 只匯出表結構的方法
mysqldump -h192.168.100.990 -uroot -pmypwd -d dbname>dbnamedd.sql
34 Git常用方法總結
git經常失敗原因是要一點一點來,先普通git再用eclipse,
新增新工程用建立本地local倉庫時,會把本地程式移到倉庫裡,新加的檔案要加 add index
新增遠端倉庫需要本地倉庫初始化,需要用git,不然各種錯誤,還是原理初始的不瞭解,
使用
git init
git remote add origin https://gitee.com/supergood/xiaochong.git
git branch -r
然後先拉取再提交等等
還有配置的時候有 新增 user.name xxx, user.email xxx@email ,密碼是遠端提交時才加 的
二 微信小程式,公眾號開發
1 獲取許可權流程
a: 客戶申請(類似於小程式彈出頁面需要被授權),b 使用者同意(返回code,)c,客戶(類似於小程式伺服器)用code換token
d: 客戶(類似於小程式伺服器)根據token 獲取使用者基本資訊很多, [中間有重新整理token的功能,為了延長獲取時間,例如預設是2小時]
三:NOI NETTY模組
1 做netty登入邏輯:
a:先做登入為了安全,服務端根據 登入的引數ip和 chanel的ip判斷如相同則登入成功,做登入是實現了ChannelInboundHandlerAdapter類,的方法,在啟用的方法channelActive裡,初始化全域性變數ChannelHandlerContext,用於寫資料給server
b:成功後 開啟定時任務寫資料,其中用到了全域性變數,繼續寫任務,如果server判斷了未登入則進行登入,操作都是在channelRead方法中進行
c:還整合了 channelInactive exceptionCaught介面以做備用
2 Netty的數字傳輸分包粘包問題解決,客戶端不需要修改,只需要加上結尾符, 服務端使用
pipeline.addLast(new DelimiterBasedFrameDecoder(Delimiter_length, delimiter));
pipeline.addLast("decoder", new StringDecoder());
pipeline.addLast("encoder", new StringEncoder());
客戶端用心跳只用普通的即可
new IdleStateHandler(20, 0, 0, TimeUnit.SECONDS),
idleStateTrigger,
new StringDecoder(),
new StringEncoder(),
3 Netty 客戶端服務端重連機制理解
四 Dubbo 模組
1 helloworld 需要5個步驟,記得埠ip有範圍 224-239
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
public interface GreetingService {
String sayHello(String name);
}
import org.apache.dubbo.demo.GreetingService;
public class GreetingServiceImpl implements GreetingService {
public String sayHello(String name) {
return "Hello " + name;
}
}
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.ServiceConfig;
import org.apache.dubbo.demo.GreetingService;
import java.io.IOException;
public class Provider {
public static void main(String[] args) throws IOException {
ServiceConfig<GreetingService> serviceConfig = new ServiceConfig<GreetingService>();
serviceConfig.setApplication(new ApplicationConfig("first-dubbo-provider"));
serviceConfig.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
serviceConfig.setInterface(GreetingService.class);
serviceConfig.setRef(new GreetingServiceImpl());
serviceConfig.export();
System.in.read();
}
}
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.apache.dubbo.demo.GreetingService;
public class Consumer {
public static void main(String[] args) {
ReferenceConfig<GreetingService> referenceConfig = new ReferenceConfig<GreetingService>();
referenceConfig.setApplication(new ApplicationConfig("first-dubbo-consumer"));
referenceConfig.setRegistry(new RegistryConfig("multicast://224.5.6.7:1234"));
referenceConfig.setInterface(GreetingService.class);
GreetingService greetingService = referenceConfig.get();
System.out.println(greetingService.sayHello("world"));
}
}
23 daterangepicker 外掛作用是範圍內是時間值input
需要引入3個檔案和1個js
<link rel="stylesheet" type="text/css" href="<%=basePath %>Scripts/daterangepicker/daterangepicker.css">
<script type="text/javascript" src="<%=basePath %>Scripts/daterangepicker/moment.min.js"></script>
<script type="text/javascript" src="<%=basePath %>Scripts/daterangepicker/daterangepicker.js"></script>
// 初始化時間控制元件
$("#fromDateId,#toDateId").daterangepicker({
"locale": {
"format": "YYYY-MM-DD HH:mm:ss"
},
"timePicker": true,
"timePicker24Hour": true,
"setlanguage": "zh-cn",
"timePickerSeconds": true,
"showClearBtn": true,//是否顯示清空按鈕
singleDatePicker: true,
showDropdowns:true
}, function (start, end, label) {
});
24 js引入el和使用el資料方法,jsp預設開啟了el表示式
var abc = ${abc};
25用jquery.pager實現分頁
成熟的解決方案
https://github.com/jonpauldavies/jquery-pager-plugin
26 maven 搭建web專案方法
新建 maven工程, 過濾的時候填寫 webapp 選中完成 執行即可
27 shiro動態更新許可權有兩個場景
因為存在了 realm和 factorybean,需要更新這兩個
factorybean是個基礎的 許可權,在shirofilter裡面,基礎許可權修改就是重新設定filter攔截器作為原理
ServletContext servletContext = request.getServletContext();
WebApplicationContext webAppContext = WebApplicationContextUtils.getWebApplicationContext(servletContext);
ShiroPermissionFactory shiroPermissionFactory = (ShiroPermissionFactory)BeanFactoryUtils.beanOfTypeIncludingAncestors(webAppContext, ShiroPermissionFactory.class);
shiroPermissionFactory.setFilterChainDefinitions(ShiroPermissionFactory.definitions);
另外一個是 realm,這個許可權針對於 的是具體使用者許可權變更,動態修改使用者許可權就是先刪除掉所有的許可權,然後程式一看沒有則自動呼叫realm驗證達到了 動態修改許可權的目的
User user = userDao.getUserById(userId);
RealmSecurityManager rsm = (RealmSecurityManager) SecurityUtils.getSecurityManager();
CustomRealm shiroRealm = (CustomRealm)rsm.getRealms().iterator().next();
Subject subject = SecurityUtils.getSubject();
String realmName = subject.getPrincipals().getRealmNames().iterator().next();
SimplePrincipalCollection principals = new SimplePrincipalCollection(user.getUserName(), realmName);
if (shiroRealm.getAuthorizationCache().get(principals) != null) {
shiroRealm.getAuthorizationCache().remove(principals);
subject.releaseRunAs();
}
五 Spring boot的學習
1 異常全域性處理和配置
@ControllerAdvice 用於全域性配置,例如配置 統一一場處理資訊
配合@ExceptionHandler即可
2 日誌配置,預設有四種 logback,log4j,log4j2,Logging
配置log目錄
logging.file=d:/abc.log
配置日誌級別
logging.level.org.springframework.web=DEBUG
六 大資料相關技術
1 常見的 優化:
太高的TPS放於快取中,用於讀取db
插入資料不會慢,因為是順序執行,查詢會慢,當大雨500萬行的時候(需要垂直分表)
水平拆分表就是 大表拆分為小表
2 叢集和分散式區別,叢集是多個相同系統,分散式是 一個系統分佈各自的模組分佈到 不同的機器上
3 分表中介軟體 mycat,cobar,tddl
七 面試總結
1 Hahmap的理解
型別 |
新增 |
刪除 |
查詢 |
|
陣列 |
N |
n |
1(下標)/n(值)/高效為logn |
|
Hash |
1 |
1 |
1(主幹為陣列) |
|
先通過雜湊函式計算出實際儲存地址,然後從陣列中對應地址取出即可,陣列和鏈地址法,
陣列+連結串列 的方法
建構函式兩個值,一個是載入銀子,填充程度,太高了,影響查詢效率,但有空間利用率,一個是 xxxx
2 死鎖原因和條件
死鎖是 多個程式有持有自己的資源同時申請別人的資源,進入迴圈等待狀態,四個條件,都不是共享資源,都不可剝奪
都進行對方申請迴圈等待,都進入了迴圈狀態
3 hessian
二進位制協議,多個客戶端寫的,高效不必學習其他巨大協議
4 Java虛擬機器類載入流程和常用 虛擬機器命令
jps 模仿 unix的命令ps 功能也類似,是檢視虛擬機器所有程式
jstat -gcutil 3222
suvivor0 suvivor1 eden O P YGC YGCT FGC FGCT GCT
倖存者(from),倖存者To 伊甸園就是類剛被載入進來存放的地方,gc回收後清空,倖存者兩個有一個必為空,可以相互轉化,O老年代,P持久帶,都是百分比,
YGC minor gc次數,耗時,全gc次數,耗時,總的 GC回收時間包含前面兩個
類載入的流程
從位元組碼轉為機器碼可能是
類的編譯--載入--連線(驗證(),準備,解析)--初始化(真正的給靜態變數賦值)
五:面試題彙總
session共享機制:
1 共享儲存的檔案目錄
2 使用memcache儲存,因為有過期機制
dubbo 面試
常見協議:dubbo,採用三個整合mina,hessian(用於序列話),nio單連線場連結,不適合大檔案傳輸
hessian和上面相反,短連結,多連線,可以傳檔案
註冊中心:
zookeeper,multiple,redis
一00 疑問
1 layerui表單驗證錯誤如何實現的需要檢視
2 需要的知識 spring boot 實現thefleave
3 springboot整合了端到端或者廣播 websocket stomp
4 Echache-clusterhe和Redis分散式快取的區別
5 GAUVAcache如何實現
6 MapDB3.0heHTreeMap
相關文章
- 知識學習綜合三---分散式系統大資料分散式大資料
- web知識學習Web
- 2020綜合知識
- 知識圖譜學習
- JAVA學習知識集合Java
- 前端知識學習01前端
- 前端知識學習03前端
- MyBatis知識點學習MyBatis
- Java知識點學習Java
- python綜合學習七之TensorFlow初識Python
- 系統架構師綜合知識架構
- 前端鑑權知識學習前端
- 碎片化學習前端知識前端
- Bootstrap 個人學習知識點boot
- jQuery 個人學習知識點jQuery
- 逆向爬蟲知識學習爬蟲
- Java學習知識大綱Java
- java學習知識回顧Java
- 學習記錄 -- 知識點
- java知識點學習圖Java
- ExtJs 基本知識學習JS
- 【ASM學習】基礎知識ASM
- ITPUB 知識索引--ASM 學習索引ASM
- 知識圖譜學習記錄--知識圖譜概述
- JS 學習個人知識盲點JS
- Vue學習知識點總結Vue
- Android基礎知識學習Android
- 基礎知識學習筆記筆記
- 需掌握的深度學習知識深度學習
- JavaSE基礎知識學習-----集合Java
- jquery學習之重要知識點jQuery
- WebAPI基礎知識學習(1)WebAPI
- 【ASM學習】ASM基礎知識ASM
- 車船稅業務知識學習(-)
- LLM學習(3)——搭建知識庫
- 機器學習學習筆記——基本知識機器學習筆記
- 鑑權理論知識學習
- 【深度學習】機率論知識複習深度學習