京東筆試題總結

1.程序題,當輸入type=4時,寫出如下代碼的輸出: javascript

switch (type) {
        default:
            System.out.print(4);
        case 1:
            System.out.print(1);
        case 2:
            System.out.print(2);
        case 3:
            System.out.print(3);
        }
輸出:4 3 2 1 說明,若是第一個匹配成功,則後面的都會執行,除非遇到break;type類型:

switch表達式後面的數據類型只能是byte,short,char,int四種整形類型,枚舉類型和java.lang.String類型(從java 7才容許),不能是boolean類型。

在網上看到好多文章,說switch還支持byte,short,char,int 的包裝類,首先能夠確定說switch不支持這些包裝類,可是以下的代碼又是正確的:

public static void main(String[] args) {
        switch (new Integer(45)) {
        case 40:
            System.out.println("40");
            break;
        case 45:
            System.out.println("45");//將會打印這句
            break;
        default:
            System.out.println("?");
            break;
        }
    }

能夠打印正確的結果,在挨着挨着試完Byte,Short,Character,Integer後發現均可以正確打印,因而便說switch也支持byte,short,char,int的包裝類。這種說法不徹底正確,之因此switch可以支持他們的包裝類,是由於自動拆箱(從JDK1.5開始支持自動拆箱和自動裝箱,自動拆箱就是自動將引用數據類型轉化爲基本數據類型,自動裝箱就是自動將基本數據類型轉化爲引用數據類型)的緣由,下面使用jclasslib軟件打開上面的.class文件,

0 new #2 <java/lang/Integer>                             建立一個Integer類的對象
3 dup                                                    將對象的標識壓入棧頂部
4 bipush 45                                              將整形45壓入棧中
6 invokespecial #3 <java/lang/Integer.<init>>            調用Integer類型的構造方法
9 invokervirtual #4 <java/lang/Integer.intValue>         調用intValue()方法
12 lookupswitch 2
        40:40(+28)
        45:51(+39)
        defalut:62(+50)
40 getstatic #5 <java/lang/System.out>                   得到標準輸出流
43 ldc #6 <40>                                           從常量池中將40的索引壓入棧中
45 invokevirtual #7 <java/io/PrintStream.println>        調用println()方法
48 goto 70 (+22)
51 gestatic #5 <java/lang/System.out>
54 ldc #8 <45>
56 invokevirtual #7 <java/io/PrintStream.println>
59 goto 70 (+11)
62 getstatic #5 <java/lang/System.out>
65 ldc #9<?>
67 invokevirtual #7 <java/io/PrintStream.println>
70 return

從上面的第5行咱們能夠看出編譯器自動調用了intValue()方法,若是是使用Byte會自動調用byteValue()方法,若是是Short會自動調用shortValue()方法,若是是Integer會自動調用intValue()方法。switch 的查找原理是使用key-offset在目標表格中查找的,lookupswitch後面的數字和goto後面的數字都是有規律的,關於更多信息能夠查看The Java® Virtual Machine Specification

所以switch表達式後面的數據類型只支持byte,short,char,int四種整形類型、枚舉類型和java.lang.String類型。

轉載:https://www.cnblogs.com/HDK2016/p/6854671.html
View Code

2.程序題,如下代碼最後會拋出一個異常,是第幾行拋出的:html

try{
            throw new Exception("1");
        }catch (IOException e){
            throw new Exception("2");
        }catch (Exception e) {
            throw new Exception("3");
        }finally {
            throw new Exception("4");
        }

解析:  4    有待研究  拋出最後new的exception異常java

try{
            throw new Exception("1");
        }catch (IOException e){
            throw new Exception("2");
        }catch (Exception e) {
            throw e;
//            throw new Exception("3");
        }
            finally {
            throw new Exception("4");
        }
java.lang.Exception: 4
try{
            throw new Exception("1");
        }catch (IOException e){
            throw new Exception("2");
        }catch (Exception e) {
//            throw e;
            throw new Exception("3");
        }
            finally {
//            throw new Exception("4");
        }
    }
java.lang.Exception: 3
try{
            throw new Exception("1");
        }catch (IOException e){
            throw new Exception("2");
        }catch (Exception e) {
            throw e;
//            throw new Exception("3");
        }
            finally {
//            throw new Exception("4");
        }
java.lang.Exception: 1

 三、web容器有幾種做用域?如何防止SQL注入?mysql

1、SQL注入簡介

SQL注入是比較常見的網絡攻擊方式之一,它不是利用操做系統的BUG來實現攻擊,而是針對程序員編程時的疏忽,經過SQL語句,實現無賬號登陸,甚至篡改數據庫。

2、SQL注入攻擊的整體思路

1.尋找到SQL注入的位置

2.判斷服務器類型和後臺數據庫類型

3.針對不通的服務器和數據庫特色進行SQL注入攻擊

3、SQL注入攻擊實例

好比在一個登陸界面,要求輸入用戶名和密碼:

能夠這樣輸入實現免賬號登陸:

用戶名: ‘or 1 = 1 –

密 碼:

點登錄,如若沒有作特殊處理,那麼這個非法用戶就很得意的登錄進去了.(固然如今的有些語言的數據庫API已經處理了這些問題)

這是爲何呢? 下面咱們分析一下

從理論上說,後臺認證程序中會有以下的SQL語句:

String sql = "select * from user_table where username=' "+userName+" ' and password=' "+password+" '";
當輸入了上面的用戶名和密碼,上面的SQL語句變成:

SELECT * FROM user_table WHERE username='’or 1 = 1 -- and password='’
分析SQL語句:

條件後面username=」or 1=1 用戶名等於 」 或1=1 那麼這個條件必定會成功;

而後後面加兩個-,這意味着註釋,它將後面的語句註釋,讓他們不起做用,這樣語句永遠都能正確執行,用戶輕易騙過系統,獲取合法身份。

這仍是比較溫柔的,若是是執行

SELECT * FROM user_table WHERE username='' ;DROP DATABASE (DB Name) --' and password=''
….其後果可想而知…

4、應對方法

下面我針對JSP,說一下應對方法:

1.(簡單又有效的方法)PreparedStatement

採用預編譯語句集,它內置了處理SQL注入的能力,只要使用它的setXXX方法傳值便可。

使用好處:

(1).代碼的可讀性和可維護性.

(2).PreparedStatement盡最大可能提升性能.

(3).最重要的一點是極大地提升了安全性.

原理:

sql注入只對sql語句的準備(編譯)過程有破壞做用

而PreparedStatement已經準備好了,執行階段只是把輸入串做爲數據處理,

而再也不對sql語句進行解析,準備,所以也就避免了sql注入問題.

2.使用正則表達式過濾傳入的參數

要引入的包:

import java.util.regex.*;

正則表達式:

private String CHECKSQL = 「^(.+)\\sand\\s(.+)|(.+)\\sor(.+)\\s$」;

判斷是否匹配:

Pattern.matches(CHECKSQL,targerStr);

下面是具體的正則表達式:

檢測SQL meta-characters的正則表達式 :/(\%27)|(\’)|(\-\-)|(\%23)|(#)/ix

修正檢測SQL meta-characters的正則表達式 :/((\%3D)|(=))[^\n]*((\%27)|(\’)|(\-\-)|(\%3B)|(:))/i

典型的SQL 注入攻擊的正則表達式 :/\w*((\%27)|(\’))((\%6F)|o|(\%4F))((\%72)|r|(\%52))/ix

檢測SQL注入,UNION查詢關鍵字的正則表達式 :/((\%27)|(\’))union/ix(\%27)|(\’)

檢測MS SQL Server SQL注入攻擊的正則表達式:/exec(\s|\+)+(s|x)p\w+/ix

等等…..

3.字符串過濾

比較通用的一個方法:

(||之間的參數能夠根據本身程序的須要添加)

複製代碼
public static boolean sql_inj(String str)
{
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
String inj_stra[] = split(inj_str,"|");
for (int i=0 ; i &lt; inj_stra.length ; i++ )
{
if (str.indexOf(inj_stra[i])&gt;=0)
{
return true;
}
}
return false;
}
複製代碼
4.jsp中調用該函數檢查是否包函非法字符

防止SQL從URL注入:

sql_inj.java代碼:

複製代碼
package sql_inj;
import java.net.*;
import java.io.*;
import java.sql.*;
import java.text.*;
import java.lang.String;
public class sql_inj{
public static boolean sql_inj(String str)
{
String inj_str = "'|and|exec|insert|select|delete|update|
count|*|%|chr|mid|master|truncate|char|declare|;|or|-|+|,";
//這裏的東西還能夠本身添加
String[] inj_stra=inj_str.split("\\|");
for (int i=0 ; i &lt; inj_stra.length ; i++ )
{
if (str.indexOf(inj_stra[i])&gt;=0)
{
return true;
}
}
return false;
}
}
複製代碼
5.JSP頁面判斷代碼:

使用javascript在客戶端進行不安全字符屏蔽

功能介紹:檢查是否含有」‘」,」\\」,」/」

參數說明:要檢查的字符串

返回值:0:是1:不是

函數名是

複製代碼
function check(a)
{
return 1;
fibdn = new Array (」‘」 ,」\\」,」/」);
i=fibdn.length;
j=a.length;
for (ii=0; ii<i; ii++)
{ for (jj=0; jj<j; jj++)
{ temp1=a.charAt(jj);
temp2=fibdn[ii];
if (tem’; p1==temp2)
{ return 0; }
}
}
return 1;
}
複製代碼
總的說來,防範通常的SQL注入只要在代碼規範上下點功夫就能夠了。

凡涉及到執行的SQL中有變量時,用JDBC(或者其餘數據持久層)提供的如:PreparedStatement就能夠 ,切記不要用拼接字符串的方法就能夠了。

轉載:https://www.cnblogs.com/EasonJim/p/6223216.html
如何防止SQL注入
Web開發中的四個域對象(範圍由小到大):

page(jsp有效)  request(一次請求) session(一次會話) application(當前web應用)

page域指的是pageContext.

request域指的是HttpServletRequest

session 域指的是HTTPSession

application 域指的是ServletContext

之因此他們是域對象,緣由就是他們都內置了map集合,都有setAttribute getAttribute方法。並且他們的name都是String類型,而value都是Object類型。

他們都有本身固定的生命週期和做用域。

 

這四個對象的生命週期(生命週期就是值對象的建立到銷燬的期間):

page:jsp頁面被執行,生命週期開始,jsp頁面執行完畢,聲明週期結束。

request:用戶發送一個請求,開始,服務器返回響應,請求結束,生命週期結束。

session:用戶打開瀏覽器訪問,建立session(開始),session超時或被聲明失效,該對象生命週期結束。

application:web應用加載的時候建立。Web應用被移除或服務器關閉,對象銷燬。[結束]。

------------------------------------------------------------------------------------------------------------------------------------------------------------- 

注意:

1.Page只在當前jsp有效,每次請求分別對應不一樣的request.

2.Request,只在當前請求有效,每次請求分別對應不一樣的request域

【Request域】能夠調用request這個隱含對象的getAttribute()方法來訪問具備這種範圍類型的對象。也可使用getParameter(String name) return String來獲取XML裏傳遞給它的參數。

String data = "XBY request";
request.setAttribute("data4",data);
request.getRequestDispatcher("/1.jsp").forward(request, response);

Request能夠用於Forward

String data = (String)request.getAttribute("data");
out.write(data);

【若是在forward前將在Servlet程序中寫入的部份內容已經被真正地傳送到客戶端,forward方法將拋出IllegalStateException異常。】關鍵在跳轉後要return.
  若是在調用Forward方法前向servlet引擎的緩衝區(response)中寫入內容,只要寫入到緩衝區的內容尚未真正輸出到客戶端,forward方法將能夠被正常執行,原來寫入到緩衝區的內容  會被清空,可是,已經寫入到HttpServletResponse對象的響應字段信息保持有效。
  Forward請求轉發特色:
   1.客戶端只發出了一次請求,而服務器端有多個資源調用
   2.客戶端瀏覽器端RUL不會變化。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
3.Session只在一次會話中有效,會話結束就沒法取到數據了。getAttribute(String name) return Object
 HttpSession session = request.getSession();
  session.setAttribute("name", "電視");

  response.setCharacterEncoding("UTF-8");//處理中文亂碼問題
  response.setContentType("text/html;charset=UTF-8");//處理中文亂碼問題
  PrintWriter out = response.getWriter();//處理中文亂碼問題
  
  HttpSession session = request.getSession();
  String product = (String)session.getAttribute("name");
  out.write(product);

    只有當getSession()時,服務器纔會爲該瀏覽器建立session,他的生命週期默認爲30min。
<session-config>
 <session-timeout>10</session-timeout>
</session-config>
     當使用request.getSession(false);時,就是查看session,不生成session.例如在查看已購買東西時,會使用。//ie8的話,開2個瀏覽器仍是共享一個session,ie7是服務器把sessionid寫進了瀏覽器的進程中,而ie8是服務器實現了多個同一款瀏覽器的session共享。

 【cookie】若是沒有指定Cookies對象的有效期,則Cookies對象只存在於客戶端的內存。當瀏覽器關閉時,Cookies就會失效。
HttpSession session = request.getSession();
  String sessionid = session.getId();
  Cookie cookie = new Cookie("JSESSIONID", sessionid);
  cookie.setPath("/servlet");
  cookie.setMaxAge(30*60);
  response.addCookie(cookie);
  session.setAttribute("name", "電視");//從新寫cookie。設置時間。
若是禁用cookie,就是使用利用URL重寫技術讓瀏覽器的URL帶上SESSIONID。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

4.application:在JSP自動生成的Servlet文件中,是這樣定義的:final javax.servlet.ServletContext application;
ServletContext域:

1.這是一個容器

2.說明這個容器的做用範圍是整個應用程序範圍


public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   String data="xby ok";
  this.getServletContext().setAttribute("data", data);
  System.out.println("write ok!");
 }

public void doGet(HttpServletRequest request, HttpServletResponse response)
   throws ServletException, IOException {
   String value = (String)this.getServletContext().getAttribute("data");
  System.out.println(value);
 }
【補】ServletContext能夠轉發Servlet,可是Servlet不方便顯示。

forward:
String data="xby yes!";
this.getServletContext().setAttribute("data", data);
  
 RequestDispatcher rd = this.getServletContext().getRequestDispatcher("/1.jsp");
 rd.forward(request, response);
      這樣很差,由於涉及到多線程問題,ServletContext會被同一應用中的全部Servlet所共享】

      經過ServletContext讀取web資源:
InputStream in= this.getServletContext().getResourceAsStream("/WEB-INF/classes/db.properties");
Properties props = new Properties();
props.load(in);
  
String username = props.getProperty("username");
String passwd = props.getProperty("passwd");
  

     得到資源文件路徑(用於上傳下載):
String path= this.getServletContext().getRealPath("/WEB-INF/classes/db.properties");
FileInputStream in = new FileInputStream(path);】

    使用ServletContext管理相關的資源。webapp都是在jvm下執行的,因此絕對路徑就是在jvm的路徑。
ServletContext會在服務器啓動時建立,目錄在webapps中;服務器中止時會銷燬這個ServletContext.------------------------------------------------------------------------------------------------------------------------------------------------------------- -

四個域對象在選擇的時候,能用範圍小的毫不用範圍大的:

page:數據只是暫時存在集合,在jsp頁面的其餘地方要用,用page(頁面中自定義的map)

         (何時須要用map了,就用page)

Request:【程序產生數據,數據顯示完後就沒有用了】
         數據只是作顯示的,看完了就沒用了。就存request域,請求轉發,Servlet產生的處理結果(數據)交給jsp顯示。數據轉發能夠帶數據。


Session:【程序產生數據,顯示後等會還須要使用】
         數據給用戶看完了,必定還要用,會話結束了就沒用了

         用戶登陸,用戶信息發給客戶端看,看完了,一會訪問別的頁面還要看用戶信息。

         購物車,購物車成功了,給用戶看購物車,待會隨時間能夠查看購物車

         請求重定向,由於是兩次請求,每一次請求的數據,第二次請求還要看。

application:【ServletContext在jsp中另外一個名字就是application,數據顯示後,等會還須要用,還須要給別人用,例如聊天室】
              數據給一個用戶用完了,別人還要用;
             聊天室,聊天記錄,須要給全部的用戶看;統計網站在線人數,全部看到的應該是一個數

【總結】:四個域對象在選擇的時候,能用範圍小的毫不用範圍大的。
1.須要定義Map時不如用page,
2.請求Servlet,轉發給jsp的數據存request,
3.請求重定向帶過去的數據存Session,
4.全局的數據存application。
4.ServletContext:WEB容器在啓動時,他會爲每個【WEB應用程序】都建立一個對應的ServletContext對象,它表明【當前WEB應用】,駐留在服務器的內存裏。
在一個contex中的數據都是共享的,它是web應用的配置信息和配置參數。
轉載:https://www.cnblogs.com/whytohow/p/5015340.html
解析

四、MySQL樂觀鎖和悲觀鎖的概念?原理機制?程序員

悲觀鎖與樂觀鎖是兩種常見的資源併發鎖設計思路,也是併發編程中一個很是基礎的概念。本文將對這兩種常見的鎖機制在數據庫數據上的實現進行比較系統的介紹。

悲觀鎖(Pessimistic Lock)

悲觀鎖的特色是先獲取鎖,再進行業務操做,即「悲觀」的認爲獲取鎖是很是有可能失敗的,所以要先確保獲取鎖成功再進行業務操做。一般所說的「一鎖二查三更新」即指的是使用悲觀鎖。一般來說在數據庫上的悲觀鎖須要數據庫自己提供支持,即經過經常使用的select … for update操做來實現悲觀鎖。當數據庫執行select for update時會獲取被select中的數據行的行鎖,所以其餘併發執行的select for update若是試圖選中同一行則會發生排斥(須要等待行鎖被釋放),所以達到鎖的效果。select for update獲取的行鎖會在當前事務結束時自動釋放,所以必須在事務中使用。

這裏須要注意的一點是不一樣的數據庫對select for update的實現和支持都是有所區別的,例如oracle支持select for update no wait,表示若是拿不到鎖馬上報錯,而不是等待,mysql就沒有no wait這個選項。另外mysql還有個問題是select for update語句執行中全部掃描過的行都會被鎖上,這一點很容易形成問題。所以若是在mysql中用悲觀鎖務必要肯定走了索引,而不是全表掃描。

樂觀鎖(Optimistic Lock)

樂觀鎖的特色先進行業務操做,不到萬不得已不去拿鎖。即「樂觀」的認爲拿鎖多半是會成功的,所以在進行完業務操做須要實際更新數據的最後一步再去拿一下鎖就好。

樂觀鎖在數據庫上的實現徹底是邏輯的,不須要數據庫提供特殊的支持。通常的作法是在須要鎖的數據上增長一個版本號,或者時間戳,而後按照以下方式實現:

複製代碼
1. SELECT data AS old_data, version AS old_version FROM …;
2. 根據獲取的數據進行業務操做,獲得new_data和new_version
3. UPDATE SET data = new_data, version = new_version WHERE version = old_version
if (updated row > 0) {
    // 樂觀鎖獲取成功,操做完成
} else {
    // 樂觀鎖獲取失敗,回滾並重試
}
複製代碼
樂觀鎖是否在事務中其實都是無所謂的,其底層機制是這樣:在數據庫內部update同一行的時候是不容許併發的,即數據庫每次執行一條update語句時會獲取被update行的寫鎖,直到這一行被成功更新後才釋放。所以在業務操做進行前獲取須要鎖的數據的當前版本號,而後實際更新數據時再次對比版本號確認與以前獲取的相同,並更新版本號,便可確認這之間沒有發生併發的修改。若是更新失敗便可認爲老版本的數據已經被併發修改掉而不存在了,此時認爲獲取鎖失敗,須要回滾整個業務操做並可根據須要重試整個過程。

總結

樂觀鎖在不發生取鎖失敗的狀況下開銷比悲觀鎖小,可是一旦發生失敗回滾開銷則比較大,所以適合用在取鎖失敗機率比較小的場景,能夠提高系統併發性能

樂觀鎖還適用於一些比較特殊的場景,例如在業務操做過程當中沒法和數據庫保持鏈接等悲觀鎖沒法適用的地方
轉載:https://www.cnblogs.com/zhiqian-ali/p/6200874.html
四、MySQL樂觀鎖和悲觀鎖的概念?原理機制?

五、jQuery獲取元素的方法,至少寫出3種。web

 eq()     返回帶有被選元素的指定索引號的元素
 first()     返回被選元素的第一個元素
 last()     返回被選元素的最後一個元素
next()    返回被選元素的後一個同級元素
prev()    返回被選元素的前一個同級元素
parent()    獲取被選元素的父級元素
 摘要:https://www.cnblogs.com/wenJiaQi/p/6136050.html
例子:http://blog.csdn.net/u012102536/article/details/72902175
jQuery獲取元素的方法,至少寫出3種

六、寫出SQL的左鏈接、右鏈接、內鏈接、執行查詢過程的關鍵字。正則表達式

左鏈接:left join
右鏈接:right join
內鏈接:inner join
執行查詢過程:exec  procName;

摘要:http://blog.csdn.net/seanb/article/details/51594234
存儲過程摘要:https://www.cnblogs.com/hoojo/archive/2011/07/19/2110862.html
寫出SQL的左鏈接、右鏈接、內鏈接、執行查詢過程的關鍵字。

七、Linux命令行。有一個日誌文件a.log,計算包含"jd.com"的行數;將文件中的"jd.com"替換成"360buy.com";sql

有一個日誌文件a.log,計算包含"jd.com"的行數;
grep -o 'jd.com' a.log | wc -l
將文件中的"jd.com"替換成"360buy.com";
sed -i "s/jd.com/360buy.com/g"  `grepjd.com -rl /home`  目錄文件全部文件替換
 sed -i "s/jd.com/360buy.com/g" 1.txt


摘要:https://www.cnblogs.com/fullhouse/archive/2011/07/17/2108786.html
http://blog.sina.com.cn/s/blog_69f80ee601016rq1.html
https://www.cnblogs.com/end/archive/2012/05/24/2517131.html
將文件中的"jd.com"替換成"360buy.com"

 八、程序題,實現二分法查找。數據庫

<span style="font-size:18px;">#include <stdio.h>
#include <stdlib.h>

void main(){
    int doubleCheck(int a, int b, int c, int d[]);
    int d[] = { 1, 2, 3, 4, 5, 6 };
        doubleCheck(0,5,5,d);
    getchar();

}

void doubleCheck(int a,int b,int c,int d []){//a爲數組的下界,b爲數組的上界,c爲匹配目標,d爲查找的範圍數組。
    int x = (a + b) / 2;
    //遞歸的結束條件必定要寫在判斷條件以前。
    if (d[x] == c)
    {
        printf("%d",x);
    }
    if (d[x] > c)//說明在d[a]-d[x]範圍之中
    {
        doubleCheck(a, x-1, c, d);
    }
    if (d[x] < c)
    {
        doubleCheck(x+1, b, c, d);
    }



}</span>
遞歸實現二分法查找

九、咱們負責的一個站點出現沒法訪問的問題,列舉可能致使該問題的緣由,並說明如何證實,越多越好。編程

一、您訪問的域名未綁定至主機;
二、您正在使用IP訪問;
三、該站點已被網站管理員中止;
四、確認域名是否正確解析
五、萬網主機(虛擬機)有時候更改了ip 因此去看看主機ip是否更改
一個站點出現沒法訪問的問題
相關文章
相關標籤/搜索