Shiro眼皮下玩ajax,玩出302 Found

  2017/06/14這一天,是我玩Shiro安全框架最刻骨銘心的一天。由於Shiro今天給我深深的補了一刀,在這兒我也給各位補一刀吧,其實問題很簡單,解決方式也極其簡單,只是給各位分享一下這個錯誤,純屬給各位長點經驗值。css

  以前本身搭建了一套系統拿來練手,將Shiro請到這套系統中做爲了第一道防鎖線,今天閒來無事想加個短信驗證碼上去,就登錄了中國建網,還好,以前玩剩下的還有3條短信,因而就小忙了起來,找到好久之前玩過的SMS短信發送的那段代碼,可是代碼很亂很髒,由於那時候不懂事兒瞎寫的,如今整理了一下我就不客氣了,給你們貼在這兒了,哈哈~~因爲這是一段模版代碼,只需把本身在短信平臺註冊的用戶名和接口調用的祕匙補上去,還有將你想要發送的隨機驗證碼和短信模板內容告訴接口就OK。前端

 1   public static String sendCode(String url,String encoded,String mobile,String SMSTemplate){  2         //獲取隨機6位驗證碼
 3         String code = VerifyCodeUtils.generateVerifyCode(6);  4         HttpClient client = new HttpClient();  5         PostMethod post = new PostMethod(url);  6         post.addRequestHeader("Content-Type", "application/x-www-form-urlencoded;charset="+encoded);  7         NameValuePair[] data = {  8                 new NameValuePair("Uid", 用戶名),  9                 new NameValuePair("Key", 祕匙), 10                 new NameValuePair("smsMob", mobile), 11                 new NameValuePair("smsText", "驗證碼:"+code+SMSTemplate)}; 12  post.setRequestBody(data); 13         try { 14  client.executeMethod(post); 15             Header[] headers = post.getResponseHeaders(); 16             int statusCode = post.getStatusCode(); 17             System.out.println("statusCode:" + statusCode); 18             for (Header h : headers) { 19  System.out.println(h.toString()); 20  } 21             String result = new String(post.getResponseBodyAsString().getBytes("gbk")); 22             System.out.println(result); // 打印返回消息狀態
23 
24  post.releaseConnection(); 25         } catch (Exception e) { 26  e.printStackTrace(); 27  } 28         
29         return code; 30     }

    需求:用戶登陸要求必須輸入正確的用戶名和密碼,最後還要二次驗證經過,發送短信驗證碼來校驗該用戶是否合法?ajax

  需求分析及場景還原:spring

    因爲個人登陸功能是經過shiro安全框架來實現的,因此短信驗證碼功能就必須經過發送ajax異步請求後臺,將系統發送出去的短信驗證碼保存在了session中,而後在用戶認證過程當中取出登陸用戶在頁面輸入的驗證碼對比便可。可是,不幸的是,我不夠老道不夠細心經驗不足,致使shiro讓我圍着它轉了將近一天。點擊按鈕獲取短信驗證碼,在這兒我是經過給按鈕綁定點擊事件來發送ajax請求,後臺經過調用上面抽取的工具方法來給指定用戶發送短信內容,邏輯沒錯吧。就這麼簡單,爲何我就能玩出302 Found呢,也許你們還不清楚302 Found是什麼意思吧?我也不說網上那些繞來繞去的說法,個人理解就是資源存在,可是因爲重定向設定權限而致使未正確跳轉至目標連接。找了一天資料,學了各類說法,也試了各類方法,可是最後解決問題的是一句出乎意料的簡單配置,下面就給你們把現場佈置一下吧,302 Found的奇妙出現,我居然分析了那麼久。瀏覽器

    大家不要懷疑我後臺代碼寫錯了或是前端代碼寫錯了,沒有的事兒。當我一點擊按鈕ajax方法不執行,在瀏覽器中打斷點各類嘗試走到發送ajax的那段代碼就跳過去,請求也不發,後臺代碼確定也不執行,爲啥,難道我前端js代碼寫錯了?不會啊,昨天還剛把異步加載菜單的那玩意兒給搞出來了,js代碼寫了一成天也沒出什麼意外,今天就寫這麼幾行簡單的js代碼不會太過度吧。因而就各類打斷點各類分析,我這我的吧,在開發中只要是我代碼的執行邏輯沒問題,我就會把他測試到爛也得把問題找出來,行此次我輸,實在是耗不起啊,也不是太大的問題,就這麼耗着不值得。叫師兄過來看看吧,也許當局者迷,他過來也是一頓斷點各類走流程,沒錯啊你這咋回事啊,奇了怪了~~~我看他也被這看似正常內藏大坑的代碼搞無語了,我就說行吧,我再自個兒琢磨一下吧,你先把你的活幹了。安全

    接着我又趴在桌子上想啊想啊,登陸能正常調用,我發送個ajax不至於這麼絕吧,一杯水下肚,巧了,Shiro在跟我開玩笑呢,你利用了我,就得時刻注意個人一舉一動,原來我是把發送短信驗證碼的方法給攔截了,哎吆我滴孩啊,這種錯誤不是技術惹的禍,而是你就踩過這坑沒,只要你玩過這功能玩過這樣的業務,你就會,其實我纔在IT界混了短短2年多,哪有那麼深的手法啊,在這裏我不是繞圈子給你們炫我作的功能,而是想給你們分享這種錯誤,我但願讀到這篇博文的朋友有個印象,之後遇到足夠你裝了,瞬間解決問題,我們這行不就是拿經驗混飯吃嘛。session

  解決方式:配置忽略項。在spring管理Shiro安全框架的配置文件中配置獲取驗證碼的方法,讓它能夠匿名訪問便可,就是用戶沒有登陸,也能夠發送請求到後臺執行方法。app

 1      <!-- shiro鏈接約束配置 -->
 2         <property name="filterChainDefinitions">
 3             <value>
 4                 <!-- 對靜態資源設置容許匿名訪問 -->
 5  /images/** = anon  6  /js/** = anon  7  /css/** = anon  8                 <!-- 可匿名訪問路徑,例如:短信驗證碼、登陸鏈接、退出鏈接等 -->
 9  /auth/login = anon 10  /user/sendCode = anon 11                 <!-- 剩餘其餘路徑,必須認證經過才能夠訪問 -->
12  /** = authc 13             </value>
14         </property>

    最後提醒你們,之後用到安全框架,就請善待它,這種錯誤你是學不到的,只有下過坑才能嚐到那種美味。框架

相關文章
相關標籤/搜索