知識學習綜合

瓜瓜東西發表於2018-08-08

一 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 章節:

https://docs.spring.io/spring-boot/docs/1.5.8.RELEASE/reference/htmlsingle/#howto-create-a-deployable-war-file

 

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

相關文章