面試題

csrf是什麼:

CSRF跨站點請求僞造,

1. 用戶C打開瀏覽器,訪問受信任網站A,輸入用戶名和密碼請求登錄網站A;

2. 在用戶信息通過驗證後,網站A產生Cookie信息並返回給瀏覽器,此時用戶登錄網站A成功,可以正常發送請求到網站A;

3. 用戶未退出網站A之前,在同一瀏覽器中,打開一個TAB頁訪問網站B;

4. 網站B接收到用戶請求後,返回一些攻擊性代碼,併發出一個請求要求訪問第三方站點A;

5. 瀏覽器在接收到這些攻擊性代碼後,根據網站B的請求,在用戶不知情的情況下攜帶Cookie信息,向網站A發出請求。網站A並不知道該請求其實是由B發起的

,所以會根據用戶C的Cookie信息以C的權限處理該請求,導致來自網站B的惡意代碼被執行

 

PHP與MYSQL事務處理:

1、用begin,rollback,commit來實現

begin 開始一個事務

rollback 事務回滾

commit 事務確認

2、直接用set來改變mysql的自動提交模

 

事務的4大特性(ACID):

原子性(Atomicity):

       事務是數據庫的邏輯工作單位,它對數據庫的修改要麼全部執行,要麼全部不執行。

一致性(Consistemcy):

       事務前後,數據庫的狀態都滿足所有的完整性約束。

隔離性(Isolation):

       併發執行的事務是隔離的,一個不影響一個。如果有兩個事務,運行在相同的時間內,執行相同的功能,事務的隔離性將確保每一事務在系統中認爲

只有該事務在使用系統。這種屬性有時稱爲串行化,爲了防止事務操作間的混淆,必須串行化或序列化請求,使得在同一時間僅有一個請求用於同一數據。

通過設置數據庫的隔離級別,可以達到不同的隔離效果。

 

持久性(Durability):

       在事務完成以後,該事務所對數據庫所作的更改便持久的保存在數據庫之中,並不會被回滾。

 

 

xss怎麼防止:

 

XSS又稱CSS,全稱CrossSiteScript,跨站腳本攻擊

防止: script注入,轉義過濾script標籤。

 

 

union和unionall的區別:

       union去重,unionall不去重

 

RBAC   基於角色的權限控制:

       5張表    用戶表、角色表、功能表,還有他們之間互相關聯的表:用戶與角色表、角色與功能表

 

 

redis持久化:

       內存快照(RDB) RDB 持久化可以在指定的時間間隔內生成數據集的時間點快照

       日誌(AOF) AOF 持久化記錄服務器執行的所有寫操作命令,並在服務器啓動時,通過重新執行這些命令來還原數據集。

 

 

分表:

       減小數據庫的負擔,縮短查詢時間。

       垂直分表:垂直分割就是按字段分.

       水平分表:根據一列或多列數據的值把數據行放到兩個獨立的表中。

 

水平分表怎麼保證插入的id的唯一?

       可以新建一個id服務,把用戶的id保存在數據庫或者redis中。

 

jquery選擇器:

       1.元素    2.屬性   3.id 4.類 5.全局。

 

 

行內元素和塊內元素

       行內:<a>,<b>,<br>,<i>,<img>

       塊內:<div>,<p>,<h1>

       轉換:display:inline,block,inline-block.

 

區別:

塊、

       ①總是在新行上開始,佔據一整行;

       ②高度,行高以及外邊距和內邊距都可控制;

       ③寬帶始終是與瀏覽器寬度一樣,與內容無關;

       ④它可以容納內聯元素和其他塊元素。

行、

       ①和其他元素都在一行上;

       ②高,行高及外邊距和內邊距部分可改變;

       ③寬度只與內容有關;

       ④行內元素只能容納文本或者其他行內元素。

 

 

分組查詢:orderby

 

表中統計男女個數20-30

       select count(sex) from 表where age between 20 and 30 group bysex

 

 

ORM

       對象關係映射(Object Relational Mapping,簡稱ORM)模式是一種爲了解決面向對象與關係數據庫存在的互不匹配的現象的技術

 

Linux查看端口:刷選文件:查看進程:

      netstat-ntlp   //查看當前所有tcp端口·

       netstat-ntulp |grep80   //查看所有80端口使用情況·

       netstat-an | grep3306   //查看所有3306端口使用情況·

 

 

Linux查看執行多少命令:history

 

 

文件操作函數:

       open   打開文件

      fstat     獲取文件

      file      把整個文件讀入一個數組中

       fclose   關閉文件

       fwrite   寫入文件(可安全用於二進制文件)

       file_get_contents()將整個文件讀入一個字符串

 

 

打開文件的幾種方式:

       Fopen(),     file_get_contents()

       讀寫,追加

 

php刪除文件夾命令

       Unlink();

 

 

中文字符串截取:mb_substr

       mb_substr($str,$start, $length, $encoding )

       $str,需要截斷的字符串

       $start,截斷開始處,起始處爲0

       $length,要截取的字數

       $encoding,網頁編碼,如utf-8,GB2312,GBK

 

 

D和M的區別:

       M實例化基類,D可以實例化自定義類

 

 

table隔行變色:

       通過JQ識別table tr td的雙數單數,對應單數雙數給予賦予不同CSS樣式,通過不同背景,即可實現隔行換色變色效果。

當鼠標經過時候JQ調用另外設置的trtd背景,實現鼠標經過背景顏色也跟着變化

 

 

ajax同步異步:

       同步等待服務端的返回結果然後進行其他操作

       異步發送請求後不等待服務端的返回結果直接進行其他操作

默認爲:異步

 

 

Linux查看所有文件:ls

 

 

設置一個div在另一個div上:

       z-index數值越大越往上

 

 

ob函數:

      ob_start();           //打開一個輸出緩衝區,所有的輸出信息不再直接發送到涉獵器,而是保存在輸出緩衝區裏面。

      ob_clean();           //刪除內部緩衝區的內容,不關閉緩衝區(不輸出)。

      ob_end_clean();        //刪除內部緩衝區的內容,關閉緩衝區(不輸出)。

      ob_get_clean();        //返回內部緩衝區的內容,關閉緩衝區。相當於履行 ob_get_contents() and ob_end_clean()

      ob_flush();           //發送內部緩衝區的內容到涉獵器,刪除緩衝區的內容,不關閉緩衝區。

      ob_end_flush();        //發送內部緩衝區的內容到涉獵器,刪除緩衝區的內容,關閉緩衝區。

      ob_get_flush();        //返回內部緩衝區的內容,並關閉緩衝區,再釋放緩衝區的內容。相當於ob_end_flush()並返回緩衝區內容。

       flush();              //將ob_flush釋放出來的內容,以及不在PHP緩衝區中的內容,整個輸出至涉獵器;刷新內部緩衝區的內容,並輸出。

      ob_get_contents();     //返回緩衝區的內容,不輸出。

      ob_get_length();       //返回內部緩衝區的長度,如果緩衝區未被激活,該函數返回FALSE。

      ob_get_level();        //Return the nestinglevel of theoutput buffering mechanism.

      ob_get_status();       //Get status of outputbuffers.

 

3.購物車怎麼做的?流程。。

       一、將商品添加到購物車

       1.先在頁面上添加一個鏈接

       1.先得到商品id

       2.從數據庫中通過id將商品查詢出來。

       3.將商品添加到購物車

       a.從session中獲取購物車,沒有的話,重新new 出一個

       b.判斷商品在購物車中是否存在,如果不存在,數量爲1,如果存在,數量在原基礎上加1

       c.將購物車重新裝入到session中。

 

問題:我們的購物使用的是一個HashMap集合,key是唯一的,保證key唯一的方式是通過hashCode與equals方法

所以我們在使用時,需要將Product類的hashCode與equals方法重寫,我們在重寫時,只比較id值就可以。

二、顯示購物車商品

       我們的購物車是存在於session中的。我們只需要在cart.jsp頁面將session中的cartt這個Map集合得到,並顯示出來就可以。

       1.對購物車中商品操作

       2.在點擊+或-號時可以修改購物車中商品的數量

       3.當點擊+或-按鈕時,我們會調用一個javascript中的函數。changeCount();通過這個函數我們向服務器發送請求,在服務器端從session中獲取購物車中數據,並根據提交的數據將購物車中指定的商品數量修改在返回到購物車頁面展示。

 

 

最近一個月的銷售額怎麼取?三個月?一年呢?

       查數據庫某個字段

 

怎麼在30萬條數據3秒內取出來?建立什麼索引?

       普通索引

 

索引類型:

       普通索引、唯一索引、主鍵索引、組合索引

 

 

redis和memecache的不同在於:

       1、存儲方式:

       memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。redis有部份存在硬盤上,這樣能保證數據的持久性。

       2、數據支持類型:

       redis在數據支持上要比memecache多的多。

       3、使用底層模型不同:

       新版本的redis直接自己構建了VM 機制 ,因爲一般的系統調用系統函數的話,會浪費一定的時間去移動和請求。

       4、運行環境不同:

       redis目前官方只支持LINUX 上去行,從而省去了對於其它系統的支持,這樣的話可以更好的把精力用於本系統 環境上的優化,雖然後來微軟有一個小組爲其寫了補丁。但是沒有放到主幹上

 

 

SKU怎麼做:

       屬性規格。

       其實sku就是商品單數 庫存量單位  包括商品表 商品屬性表 貨品表

 

tp的配置文件:common/config.php

 

 

php的數據類型:

       四種標量類型:

        boolean (布爾型)

        integer (整型)

        float (浮點型, 也稱作 double)

        string (字符串)

       兩種複合類型:

          array(數組)

          object(對象)

       最後是兩種特殊類型:

            resource (資源)

        NULL (NULL)

 

單例模式:

       單例模式的主要特點是“三私一公”:

       需要一個保存類的唯一實例的私有靜態成員變量

       構造函數必須聲明爲私有的,防止外部程序new一個對象從而失去單例的意義

       克隆函數必須聲明爲私有的,防止對象被克隆

       必須提供一個訪問這個實例的公共靜態方法(通常命名爲getInstance),從而返回唯一實例的一個引用。

 

 

查詢出20-30之間的男女個數:

//select count(sex) from 表where age between 20 and 30group by sex

Select count(*)  from 表名where  age  between 20  and  30 group by  age. Group by

 

      

PHP中有三種訪問修飾符,分別是:

    public(公共的、默認)

    protected(受保護的)

private(私有的)

訪問權限修飾符的範圍:

當類的成員被聲明爲public的訪問修飾符時,該成員能被外部代碼訪問和操作。

private(私有的)

被定義爲private的成員,對於類內部所有成員都可見,沒有訪問限制。對類外部不允許訪問。

protected(受保護的)

protected稍微有點複雜,被聲明爲protected的成員,只允許該類的子類進行訪問。

 

 

mysql int存儲:

       bigint  存儲大小爲 8 個字節。

       int存儲大小爲 4 個字節。

       smallint存儲大小爲 2 個字節。

       tinyint  從 0 到 255 的整型數據。存儲大小爲1 字節。

 

 

cookie的作用域:

       domain本身。domain底下的所有域名。

       就是給cookie設置一個權限。當domain設置爲空時,domain默認爲當前域名,並且該域名下的子域名都可以接收到cookie。

       但是domain參數設置其    子域名時,所有域名就接收不到了,包括那個子域名。

 

 

 

linux查看日誌文件內容命令

       tail、cat、tac、head、echo

       tail-f test.log

       top查看內存

       df-lh查看磁盤

       ps-a 查看所有進程

 

 

常量:

       變量使用$:

       在定義和使用常量的時候不需要使用 $ 符號。

       常量的值必須是一個定值,不能是變量,類屬性,數學運算的結果或函數調用。

       接口(interface)中也可以定義常量。

 

抽象類不能被實例化。抽象類中可以有靜態方法。抽象類中可以沒有抽象方法。

 

普通方法,存放類內,只有一份

靜態方法,也是存放於類內,只有一份

區別在於:

       普通方法需要對象去調用,需要綁定$this  即,普通方法,必須要有對象,然後讓對象來調用

       而靜態方法,不屬於哪一個對象,因此不需要綁定$this  即,不需要對象也可以調用

 

靜態成員:不需要實例化就能訪問,類的靜態成員變量只屬於這個類

類成員:一種是在類中定義,一種是在構造函數中定義。

 

方法和函數的區別:

       函數是單獨存在的,方法是依賴於類存在的,只能通過對象調用。

 

類文件是否可以定義函數:  不可以

 

 

值傳遞和值引用:

       (1)按值傳遞:函數範圍內對值的任何改變在函數外部都會被忽略

       (2)按引用傳遞:函數範圍內對值的任何改變在函數外部也能反映出這些修改

       (3)優缺點:

        A:按值傳遞時,php必須複製值。特別是對於大型的字符串和對象來說,這將會是一個代價很大的操作。

        B.按引用傳遞則不需要複製值,對於性能提高很有好處。

 

 

防止訂單重複提交:

       1.使用JS讓按鈕在點擊一次後禁用(disable)。採用這種方法可以防止多次點擊的發生

       2.設置session值.提交一次後,刪除,如果沒有session值,不讓提交.

       3cookie一樣

 

 

字符串函數:

      strlen();strpos();echo();implode();trim();等、、、

 

 

字符串反轉函數:

      strrev,     mb_string;

 

 

 

http1.0和http1.1的區別:

       HTTP1.0規定瀏覽器與服務器只保持短暫的連接,瀏覽器的每次請求都需要與服務器建立一個TCP連接,服務器完成請求處理後立即斷開TCP連接,

       服務器不跟蹤每個客戶也不記錄過去的請求。

       HTTP1.1支持持久連接,在一個TCP連接上可以傳送多個HTTP請求和響應,減少了建立和關閉連接的消耗和延遲。

       HTTP1.1還允許客戶端不用等待上一次請求結果返回,就可以發出下一次請求,但服務器端必須按照接收到客戶端請求的先後順序依次回送響應結果,

       以保證客戶端能夠區分出每次請求的響應內容,這樣也顯著地減少了整個下載過程所需要的時間

       HTTP1.0不支持Host請求頭字段。

H    TTP1.1中增加Host請求頭字段。

 

 

全局變量跟局部變量的區別:

       1.作用域不同:全局變量的作用域爲整個程序,而局部變量的作用域爲當前函數或循環等

       2.內存存儲方式不同:全局變量存儲在全局數據區中,局部變量存儲在棧區

       3.生命期不同:全局變量的生命期和主程序一樣,隨程序的銷燬而銷燬,局部變量在函數內部或循環內部,隨函數的退出或循環退出就不存在了

       4.使用方式不同:全局變量在聲明後程序的各個部分都可以用到,但是局部變量只能在局部使用。函數內部會優先使用局部變量再使用全局變量

需要注意一點的是,局部變量不能賦值爲同名全局變量的值。

 

 

前端的優化:

   第一:面向內容的優化

       1.減少 HTTP 請求

       2.減少 DNS 查找

       3.避免重定向

       4.使用 Ajax 緩存

       5.延遲載入組件

       6.預先載入組件

       7.減少 DOM 元素數量

       8.切分組件到多個域

       9.最小化 iframe 的數量

       10.  不要出現http 404 錯誤

   第二:面向 Server

       1.縮小 Cookie

       2.針對 Web 組件使用域名無關性的

 

 

什麼是緩存雪崩?

       當緩存服務器重啓或者大量緩存集中在某一個時間段失效,這樣在失效的時候,也會給後端系統(比如DB)帶來很大壓力。

 

如何避免?

       1:在緩存失效後,通過加鎖或者隊列來控制讀數據庫寫緩存的線程數量。比如對某個key只允許一個線程查詢數據和寫緩存,其他線程等待。

       2:不同的key,設置不同的過期時間,讓緩存失效的時間點儘量均勻。

       3:做二級緩存,A1爲原始緩存,A2爲拷貝緩存,A1失效時,可以訪問A2,A1緩存失效時間設置爲短期,A2設置爲長期(此點爲補充)

 

tp路由模式:

       1.普通模式       2. 重寫模式      3.兼容模式    

 

      

 

niginx端口號怎麼配置:

       在那個nginx.conf中配置兩個serve,分別爲不同的端口號。

 

 

jq獲取table標籤的第二行:

       $(tr:eq(1))

 

 

可變變量是什麼:

       可變變量允許我們動態地改變一個變量的名稱。是用一個變量的值作爲另一個變量的名稱。

 

 

查看端口有沒有被佔用:     修改權限     修改所有者    修改用戶組

netstat –apn            chmod     chown       chgrp

 

查看進程  

      Top          pa aux|grep

 

所有人添加執行權限:    

       chmod-x

 

Mysql主從複製:

       從庫生成兩個線程,一個I/O線程,一個SQL線程;

       i/o線程去請求主庫的binlog,並將得到的binlog日誌寫到relay log(中繼日誌) 文件中;

       主庫會生成一個 log dump 線程,用來給從庫 i/o線程傳binlog;

       SQL線程,會讀取relay log文件中的日誌,並解析成具體操作,來實現主從的操作一致,而最終數據一致;

 

主從複製需要的命令:

       showmaster status;

       startsalve;

       stopsalve;

       flushprivileges;

 

       GRANTREPLICATIONSLAVE,RELOAD,SUPER ON *.*

       TOmysql_backup@'%'

       IDENTIFIEDBY '123456';

 

       CHANGEMASTER TOmaster_host = '127.0.0.1',

       master_user='mysql_backup',

       master_password='123456',

       master_log_file='mysql-bin.000001',master_log_pos = 3696;

 

解決主鍵衝突問題

       創建一個總表,id從總表裏面分發。

 

 

 

主主複製:

       1.分別在兩臺機器授權賬戶:grant replication slave, file, select on *.* to'repl'@'10.17.%'identified by ‘xxxx’

       2.配置文件/etc/my.cnf,在使用主庫配置文件的基礎上,加入以下配置項

 

 

nginx反向代理:

(1)rr輪詢(默認)

      按照請求順序分配到每個RS,和lvs中的rr算法一樣,如果RS宕機,會自動剔除,默認情況下只檢測80端口,如果RS報402、403、503、504錯誤,會直接返回給客戶端。

(2)weight(權重)

      在rr的基礎上再加上權重(默認是rr+weight),權重輪詢和訪問成正比,值越大分配的越多,可以根據服務器的配置設置權重,可以解決服務器性能不均進行請求分配的問題

(3)ip_hash

      解決動態網頁session共享問題

      每個訪問請求按照IP地址的hash值進行分配,ip的hash值只要相同就會被分配到同一臺服務器上(lvs負載均衡的-p參數,keepalived配置裏的persistence_timeout50),該調度算法可以解決動態網頁session共享問題,但有時會導致請求分配不均,

      提示:由於國內用的都是nat模式,所以hash不適合使用

      ip_hash不能和其他的算法一塊使用,即不能使weight或backup

(4)fair(第三方)

      按照後端服務器的響應時間來配置,響應時間短的優先分配,比上面的都更智能,此種算法可以按照頁面大小和加載時間長短智能的進行負載均衡,nginx本身不支持fair,需要下載nginx的upstrea_fair模塊

(5)url_hash(第三方)

      主要應用於緩存服務器上

      按照訪問的url來分配請求,讓相同的url定向到同一個服務器,後端服務器爲緩存服務器的時候效果更顯著,在upstream中加入hash語句,server語句中不能寫入weight等其他的參數,hash_method是使用的hash算法。

      缺點:如果有一臺機器宕機了,那就苦了,consistent_hash可以解決這個問題

      可以提高後端緩存服務器的效率,nginx本身不支持url_hash的,需要下載hash軟件

(6)least_conn

      最少連接數,哪個連接少就分配到哪臺設備

(7)consistent_hash

      一致性算法

 

 

 

3、負載均衡:

       負載均衡部署方式:

        路由模式(推薦)

        橋接模式

          服務直接返回模式

輪循均衡:

   每一次來自網絡的請求輪流分配給內部中的服務器,從1至N然後重新開始。此種均衡算法適合於服務器組中的所有服務器都有相同的軟硬件配置並且平均服務請求相對均衡的情況。

權重輪循均衡:

   根據服務器的不同處理能力,給每個服務器分配不同的權值,使其能夠接受相應權值數的服務請求。例如:服務器A的權值被設計成1,B的權值是3,C的權   值是6,則服務器A、B、C將分別接受到10%、30%、60%的服務請求。此種均衡算法能確保高性能的服務器得到更多的使用率,避免低性能的服務器負載過重。

隨機均衡:

    把來自網絡的請求隨機分配給內部中的多個服務器。

權重隨機均衡:

   此種均衡算法類似於權重輪循算法,不過在處理請求分擔時是個隨機選擇的過程

 

4、負載均衡和反向代理的區別

       反向代理是實現負載均衡的一種方法。

       先談反向代理。用戶在請求時,先把請求發送給代理的服務器,然後由代理服務器根據算法去請求真實的服務器,最後返回給用戶。這種做法,其   一是提高了安全性;

       其二是通過多臺的real server分擔了用戶的請求,實現了負載均衡。

       再談負載均衡。負載均衡的出現,是通過橫向的擴展,儘可能地降低單臺服務器的壓力。常見WEB層面的負載均衡的方案有硬件F5、Nginx代理、LVS、各個雲商的負載均衡服務(如AWS的ELB服務)等。負載均衡後面連的一般是實際提供服務的服務器,如通過ELB服務,可以做到流量的均勻分擔,從而減少單機服務器的壓力。

       由於增加了負載均衡這層,所以單純地使用某個方案還是要考慮單點的問題。負責由於負載均衡這個服務器未能承受住壓力,宕機了,服務也是不可用的。所以Nginx、LVS儘量配置多臺代理,可以故障轉移和故障報警,從而及時去處理代理層服務器的問題。ELB是亞馬遜提供的服務,它本身的實現底層就有數百甚至上千的機器,所以把它想象成一個代理集羣就好。

 

      

 

怎麼實現session共享:

       首先我們應該明確,爲什麼要實現共享,假設你的站點是存放在一個機器上,那麼是不存在這個問題的,由於會話數據就在這臺機器,可是假設你使用了負載均衡把請求分發到不同的機器呢?這個時候會話id在client是沒有問題的,可是假設用戶的兩次請求到了兩臺不同的機器,而它的session數據可能存在當中一臺機器,這個時候就會出現取不到session數據的情況,於是session的共享就成了一個問題

       1.基於NFS的Session共享

       2.基於數據庫的Session共享

       3.基於Cookie的Session共享

       4.基於緩存(Memcache)的Session共享

       5.session複製

 

 

變量的作用域:

       全局變量,局部變量。

 

創建壓縮文件:

       zip、gzip、bzip2、tar Zcvf;

 

 

varchar20能存多少漢字?

       首先要確定mysql版本

       4.0版本以下,varchar(20),指的是20字節,如果存放UTF8漢字時,只能存16個(每個漢字3字節)

       5.0版本以上,varchar(20),指的是20字符,無論存放的是數字、字母還是UTF8漢字(每個漢字3字節),都可以存放20個

       其實最好的辦法是在自己數據庫中建個表試試可以放多少漢字,現在mysql都5.0已上了,varchar(20)是可以存20個漢字的

 

做登錄的時候用戶名和密碼怎麼儲存的:

       一般我們用cookie將用戶信息會儲存在客戶端,比如實現一個七天免登陸等。

       我們在登錄的時候先設置cookie的參數,將用戶名和密碼都儲存起來,下次當跳轉到下一個頁面的時候,

       我們可以先判斷有沒有cookie的值,如果有就直接跳轉到下一個頁面,如果沒有那麼就要提示請登錄。 

       實現cookie的儲存後,用戶就能不用輸入密碼就可以登錄成功了!

 

 

 

查看防火牆的命令:

       查看防火牆狀態: service iptables status

       開啓防火牆:service iptables start

       關閉防火牆:service iptables stop

 

 

聚簇索引和非聚簇索引:

       1、聚簇索引

       a)一個索引項直接對應實際數據記錄的存儲頁,可謂“直達”

       b)主鍵缺省使用它

       c)索引項的排序和數據行的存儲排序完全一致,利用這一點,想修改數據的存儲順序,可以通過改變主鍵的方法(撤銷原有主鍵,另找也能滿足主鍵要求的一個字段或一組字段,重建主鍵)

       d)一個表只能有一個聚簇索引(理由:數據一旦存儲,順序只能有一種)

 

2、非聚簇索引

       a)不能“直達”,可能鏈式地訪問多級頁表後,才能定位到數據頁

       b)一個表可以有多個非聚簇索引

 

 

單點登錄:

       一. 登陸原理說明

       單點登錄的技術實現機制:當用戶第一次訪問應用系統1的時候,因爲還沒有登錄,會被引導到認證系統中進行登錄;根據用戶提供的登錄信息,認證系統進行身份效驗,如果通過效驗,應該返回給用戶一個認證的憑據--ticket;用戶再訪問別的應用的時候,就會將這個ticket帶上,作爲自己認證的憑據,應用系統接受到請求之後會把ticket送到認證系統進行效驗,檢查ticket的合法性。如果通過效驗,用戶就可以在不用再次登錄的情況下訪問應用系統2和應用系統3了。

可以看出,要實現SSO,需要以下主要的功能:

       a)所有應用系統共享一個身份認證系統;

       b)所有應用系統能夠識別和提取ticket信息;

       c)應用系統能夠識別已經登錄過的用戶,能自動判斷當前用戶是否登錄過,從而完成單點登錄的功能

基於以上基本原則,本人用php語言設計了一套單點登錄系統的程序,目前已投入正式生成服務器運行。本系統程序,將ticket信息以全系統唯一的 session id作爲媒介,從而獲取當前在線用戶的全站信息(登陸狀態信息及其他需要處理的用戶全站信息)。

 

登陸流程:

   1. 第一次登陸某個站:

       a)用戶輸入用戶名+密碼,向用戶驗證中心發送登錄請求

       b)當前登錄站點,通過webservice請求,用戶驗證中心驗證用戶名,密碼的合法性。如果驗證通過,則生成ticket,用於標識當前會話的用戶,並將當前登陸子站的站點標識符記錄到用戶中心,最後

       c)將獲取的用戶數據和ticket返回給子站。如果驗證不通過,則返回相應的錯誤狀態碼。

       d)根據上一步的webservice請求返回的結果,當前子站對用戶進行登陸處理:如狀態碼錶示成功的話,則當前站點通過本站cookie保存ticket,並本站記錄用戶的登錄狀態。狀態碼錶示失敗的話,則給用戶相應的登錄失敗提示。

   2. 登陸狀態下,用戶轉到另一子:

       a)通過本站cookie或session驗證用戶的登錄狀態:如驗證通過,進入正常本站處理程序;否則戶中心驗證用戶的登錄狀態(發送ticket到用戶驗證中心),如驗證通過,則對返回的用戶信息進行本地的登錄處理,否則表明用戶未登錄。

 

    登出流程:

       a)當前登出站清除用戶本站的登錄狀態和 本地保存的用戶全站唯一的隨機id

       b)通過webservice接口,清除全站記錄的全站唯一的隨機id。webservice接口會返回,登出其他已登錄子站的javascript代碼,本站輸出此代碼。

       c)js代碼訪問相應站W3C標準的登出腳本

 

 

 

類常量如何定義:

       Const

 

什麼是抽象方法:

       沒有方法體的方法就是抽象方法,用關鍵字abstract來修飾.

 

 

ajax的數據類型,參數:

       1.json      2.jsonp   3.xml     4.html

 

三級聯動:

       子類調用父類ID   遞歸

 

 

 

解決主鍵衝突      配置文件命令

 

#auto_increment_offset =1

#auto_increment_increment=2

 

 

 

5.爲什麼使用會話控制

       http協議是一個無狀態的協議通過session ID來標識用戶

 

6.協議有哪些

       httpHTTPS ip

 

7 HTTP協議是什麼

        超文本傳輸協議

 

8. XML和HTML是什麼;

       XML是可擴展標記語言

       HTML是超文本標記語言

 

9、jsonp是什麼

       進行跨域請求的一種方式利用了<script>元素的開放策略通過get請求來進行跨域請求

 

10.yii框架小部件

       小部件基本上在views中使用,在視圖中可調用 yii\base\Widget::widget() 方法使用小部件。

 

11.tp框架配置文件

       common/config.php

 

12.tp框架的單字母方法

       C獲取配置值

       D實例化Model類

       L語言定義函數

       I獲取輸入參數

       M用於實例化一個沒有模型文件的Model

...

13.回調函數

       array_map、array_walk、 array_reduce

 

 

子類調用父類靜態方法

       parent::$a

php報錯級別:

       fatalerror致命錯誤: 0000 0000 0000 001 開啓 1

       warning警告錯誤 : 0000 0000 0000 010 開啓 2

       NOTICE警告 : 0000 0000 0001 000 開啓 8

 

while  do while 區別:

       while是先判斷再執行

       dowhile 是先執行再判斷;

 

常用的魔術方法:

       __desctruct();__get();__set();__isset()

構造方法

       實例化程序時自動調用      __construct():

析構方法,程序結束時自動調用      __destrcut():

 

子查詢:

       (把內層查詢結果當作外層查詢的比較條件)

       #不用order by 來查詢最新的商品

      selectgoods_id,goods_name from goods where goods_id = (select max(goods_id)fromgoods);

 

 

MySAM  InnoDB  區別:

       innodb寫操作快、支持事務、數據行鎖、支持外鍵,但是不支持全文索引, InnoDB的主鍵範圍更大,最大是MyISAM的2倍。

       MyISAM不支持事務和外鍵,讀操作快、支持數據鎖表、 GIS數據 、全文索引(因爲它不支持中文分詞,所以MyISAM的全文索引其實沒啥用)。

 

 

session和cookie的區別:

       1,session 在服務器端,cookie 在客戶端(瀏覽器)

       2,session 默認被存在在服務器的一個文件裏(不是內存)

       3,session 的運行依賴 session id,而 session id 是存在 cookie 中的,也就是說,如果瀏覽器禁用了cookie ,同時 session 也會失效(但是可以通過其它方式實現,比如在 url 中傳遞 session_id)

       4,session 可以放在 文件、數據庫、或內存中都可以。

       5,用戶驗證這種場合一般會用 session

接口和抽象類有什麼區別:

   1、抽象類和接口都不能直接實例化,如果要實例化,抽象類變量必須指向實現所有抽象方法的子類對象,接口變量必須指向實現所有接口方法的類對象。

    2、抽象類要被子類繼承,接口要被類實現。

    3、接口只能做方法申明,抽象類中可以做方法申明,也可以做方法實現

    4、接口裏定義的變量只能是公共的靜態的常量,抽象類中的變量是普通變量。

    5、抽象類裏的抽象方法必須全部被子類所實現,如果子類不能全部實現父類抽象方法,那麼該子類只能是抽象類。同樣,一個實現接口的時候,如不能全部實現接口方法,那麼該類也只能爲抽象類。

    6、抽象方法只能申明,不能實現,接口是設計的結果 ,抽象類是重構的結果

    7、抽象類裏可以沒有抽象方法

    8、如果一個類裏有抽象方法,那麼這個類只能是抽象類

    9、抽象方法要被實現,所以不能是靜態的,也不能是私有的。

    10、接口可繼承接口,並可多繼承接口,但類只能單根繼承。

 

for循環和foreach循環哪個快?

       foreach循環數組時,指針會自動指向下一個元素,不需要計算數組長度,沒有條件判斷和自增變量,所以性能肯定要比for高。

 

刪除表中20-30歲間,男性的所有的數據:

       Deleteform 表名 where sex =0 and age between 20 and 30;

 

靜態化和僞靜態的區別和好處?

    靜態化的網頁一般以.html或者htm結尾,地址對應的是一個文件,這個文件實實在在的存在於網站服務器的某個目錄中。

好處: 1.當訪問者訪問網頁的時候,不讀取數據庫,直接訪問網站空間對應的文件。(直接讀取文件)

      2.純靜態的網頁對搜索引擎友好,是最容易被搜索引擎所收錄的。(易收錄)

      3.由於訪問網頁的時候,不需要服務器做過多的處理,對服務器的壓力最小,所以,更容易應對高訪問量。(節省服務器壓力)

      4.一些面對數據庫的攻擊比如SQL注入攻擊,在面對靜態網頁的時候常常難以從地址入手。(安全性高)

 

僞靜態實質上還是動態的,在數據的處理過程上和動態的一樣。

好處:在網址的形式上看,僞靜態的地址和靜態的可以一摸一樣,普通的訪問者不容易分出是真靜態還是僞靜態(易收錄)

 

支付寶同步回調和異步回調:

       當一個支付請求被髮送到支付渠道方,支付渠道會很快返回一個結果。但是這個結果,只是告訴你調用成功了,不是扣款成功,這叫同步調用。很多新手會拿這個結果當作支付成功了,那就會被坑死,結果就是支付成功率特別高,伴隨着一堆無法解釋的壞賬率,測試人員尤其要注意測試數據的篡改:金額,同步返回結果,訂單號等。

同步請求參數裏面會有一個回調地址,這個地址是支付渠道在扣款成功後調用的,這叫異步調用。一般同步接口僅檢查參數是否正確,簽名是否無誤等。異步接口才告訴你扣款結果。一般異步接口有5秒以內的延遲。調用不成功會重試。有時候是這邊成功了,但支付渠道側沒收到返回,於是會繼續調。當天的支付到第二天還在 被異步調用也都是正常的。這也是開發人員需要特別注意的地方,不要當做重複支付。測試人員也要對重複回調進行測試,應只有一次有效。這還不是最坑的,一般支付渠道側,只有支付成功了才通知你。要是支付失敗了,壓根兒都不告訴你。 另一方面,如何老收不到異步結果呢?那就得查查了。同步結果不可靠,異步調用不可靠,那怎麼確定支付結果?最終的殺招就是查單了,反查,一般支付渠道側都會提供反查接口,定時獲取DB中待支付的訂單調用支付渠道側的反查接口,最終把支付渠道側扣款成功的訂單完成掉。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章