AD域賬戶自動登陸(僅限IE瀏覽器)Java簡單實現
實現流程:同步域賬戶使用者名稱至專案資料庫-》若是IE瀏覽器則通過ActiveXObject獲取PC使用者名稱-》根據使用者名稱查詢資料庫-》存在則自動登陸
步驟1:通過定時任務同步AD域賬戶使用者名稱,程式碼如下
package com.honsto.edusys.job; import java.util.Date; import java.util.Hashtable; import javax.naming.AuthenticationException; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.directory.Attribute; import javax.naming.directory.Attributes; import javax.naming.directory.DirContext; import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import org.apache.log4j.Logger; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.springframework.scheduling.quartz.QuartzJobBean; import com.honsto.core.common.base.ApplicationContextBeanUtil; import com.honsto.edusys.domain.Member; import com.honsto.edusys.service.MemberService; /** * 獲取新增AD域教師使用者儲存至資料庫 * * @author liming * */ public class AddTeacherJob extends QuartzJobBean { private final Logger log = Logger.getLogger(this.getClass()); @Override protected void executeInternal(JobExecutionContext arg0) throws JobExecutionException { String jobTitle = this.getClass().getSimpleName(); log.info(jobTitle + " start"); ApplicationContextBeanUtil adb=new ApplicationContextBeanUtil(); try { Date now = new Date(); long start = now.getTime(); int generalNum = 0; MemberService memberService = (MemberService)adb.getBean("memberService"); String host = "192.168.0.1"; // AD伺服器IP String port = "389"; // 埠 String username = "
[email protected]"; String password = "examplepassword"; String url = new String("ldap://" + host + ":" + port); Hashtable env = new Hashtable(); DirContext ctx = null; env.put(Context.SECURITY_AUTHENTICATION, "simple");// 一種模式,不用管,就這麼寫就可以了 env.put(Context.SECURITY_PRINCIPAL, username); env.put(Context.SECURITY_CREDENTIALS, password); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); env.put(Context.PROVIDER_URL, url); try { ctx = new InitialDirContext(env); SearchControls searchCtls = new SearchControls(); searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE); String searchFilter = "(&(objectCategory=person)(objectClass=user)(name=*))"; String searchBase = "DC=dbwzx,DC=com"; String returnedAtts[] = {"userPrincipalName"}; searchCtls.setReturningAttributes(returnedAtts); NamingEnumeration<SearchResult> answer = ctx.search(searchBase, searchFilter, searchCtls); // 初始化搜尋結果數為0 int totalResults = 0; while (answer.hasMoreElements()) { SearchResult sr = (SearchResult) answer.next(); // 判斷是否是OU=學校下的資料 if (sr.getName().indexOf("OU=學校") > 0) { Member member = null; String memberUserName = null; Attributes Attrs = sr.getAttributes();// 得到符合條件的屬性集 if (Attrs != null) { try { for (NamingEnumeration ne = Attrs.getAll(); ne.hasMore();) { Attribute Attr = (Attribute) ne.next();// 得到下一個屬性 // 如果屬性名是userPrincipalName if("userPrincipalName".equals(Attr.getID().toString())){ System.out.println("*********************************************************************"); System.out.println(" 屬性名:"+ Attr.getID().toString()); // 讀取屬性值 for (NamingEnumeration e = Attr.getAll(); e.hasMore(); totalResults++) { memberUserName = e.next().toString(); System.out.println(" 屬性值:"+ memberUserName); } System.out.println("*********************************************************************"); } break; } } catch (javax.naming.NamingException e) { System.err.println("Throw Exception : " + e); } } member = memberService.findMemberByLoginName(memberUserName); if(member != null){ continue; // 跳過 } else { generalNum ++; // 初始化儲存 member = new Member(); member.setUsername(memberUserName); memberService.saveMember(member); } } } } catch (AuthenticationException e) { System.out.println("身份驗證失敗!"); e.printStackTrace(); } catch (javax.naming.CommunicationException e) { System.out.println("AD域連線失敗!"); e.printStackTrace(); } catch (Exception e) { System.out.println("身份驗證未知異常!"); e.printStackTrace(); } finally { if (null != ctx) { try { ctx.close(); ctx = null; } catch (Exception e) { e.printStackTrace(); } } } long end = System.currentTimeMillis(); log.info(jobTitle + " end,used:" + ((end - start) /1000) + "seconds, add size:->" + generalNum); } catch (Exception e) { log.error(jobTitle + " Exception:", e); } } }
步驟2:在IE瀏覽器下獲取PC使用者名稱並且提交登陸表單,程式碼如下:
<script type="text/javascript"> $(function(){ // 登陸失敗和退出系統操作都會返回error資訊,通過判斷error是否為空控制系統在使用者退出及需要輸入賬號密碼時不使用AD域登陸 <c:if test="${empty error}"> // 判斷瀏覽器是不是ie var isIE = false; var userAgent = navigator.userAgent; //取得瀏覽器的userAgent字串 var isOpera = userAgent.indexOf("Opera") > -1; if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) { isIE = true; }; // 因為ie10-ie11的版本問題,不再支援document.all判斷,所以ie判斷函式要重新寫了 if(!isIE){ isIE = !!window.ActiveXObject || "ActiveXObject" in window; } // 如果是ie,則獲取以下資訊並登陸 if(isIE){ try { var WshNetwork = new ActiveXObject("WScript.Network"); jQuery("#browserName").val("IE"); jQuery("#userOfAD").val(WshNetwork.UserName); alert(WshNetwork.UserName); jQuery("#form1").submit(); } catch(e) { var promptStr = "自動登入需要允許ActiveXObject指令碼執行,請您先進行設定!" + "\n設定步驟:在“IE-Internet選項-安全-自定義級別-ActiveX控制元件和外掛-對未標記為可安全執行指令碼的ActivesX控制元件”,設定為“提示”或“啟用”"; alert(promptStr); } } </c:if> }) </script>
步驟3:修改Controller,使用者使用IE瀏覽器時根據使用者名稱查詢資料庫,根據查詢結果進行相應操作,程式碼如下:
// IE瀏覽器
if ("IE".equals(browserName)) {
// AD域登入
String userOfAD = request.getParameter("userOfAD");
if(StringUtils.isBlank(userOfAD)){
// 登陸錯誤返回登陸頁
return new ModelAndView("login", map);
}
// 判斷改AD使用者是否存在
System.out.println("當前使用者名稱" + userOfAD);
Member member = memberService.findMemberByLoginName(userOfAD);
if (member != null) {
member.setLastLoginDate(new Date());
memberService.updateMember(member);
request.getSession().setAttribute(Constant.USER, member);
if (StringUtils.isNotBlank(returnURL)) {
response.sendRedirect(returnURL);
return null;
}
return new ModelAndView(
new RedirectView(
"/list.do"),
map);
}
map.put("error", "noadusername");
// 登陸錯誤返回登陸頁
return new ModelAndView("login", map);
}
相關推薦
AD域賬戶自動登陸(僅限IE瀏覽器)Java簡單實現
實現流程:同步域賬戶使用者名稱至專案資料庫-》若是IE瀏覽器則通過ActiveXObject獲取PC使用者名稱-》根據使用者名稱查詢資料庫-》存在則自動登陸 步驟1:通過定時任務同步AD域賬戶使用者名稱,程式碼如下 package com.honsto.edusys.j
組態軟體開發(僅限後臺部分)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Fragment複用(僅限自己使用)
@Override public void newTitleSuccess(HttpNewsTitle httpNewsTitle) { list = httpNewsTitle.getNewsChannelList(); for (
Android快捷鍵。(僅限自己使用)
1.格式化程式碼:Ctrl+Alt+L 2.自動匯入包路徑:Ctrl+Alt+O 3.重新命名檔案、類名、變數名:Shift+F6 4.撤銷操作:Ctrl+Z 5.反撤銷操作:Ctrl+Shift+Z 6.全域性搜尋檔案:雙擊Shift 7.查詢:C
Ubuntu通過LDAP集成AD域賬號登錄(libnss-ldap方式)
libnss-ldapUbuntu通過LDAP集成AD域賬號登錄(libnss-ldap方式):# apt-get install libnss-ldap (中間直接回車,忽略)# vi /etc/nsswitch.confpasswd: files ldapgroup: files ldapshado
windows批處理添加AD域賬戶
方式 ria follow ech spl key block token 跳過 因為要用個批處理命令在Windows Server裏面批量添加域用戶,所以需要使用批處理命令。 我這篇是純新手教程,在百度上搜了一些批處理命令感覺屬於進階教程,研究了兩天才完成我要完成的目標。
使用NuGet釋出自己的.NET NuGet 包(僅限 .NET Standard 和 Windows)
Microsoft Note:建立 NuGet 包 Microsoft Note:快速入門:使用 Visual Studio 建立和釋出 NuGet 包(僅限 .NET Standard 和 Windows) .nuspec 引用 https://blog.csdn.net/huwei2003/article
Python識別圖形驗證碼,實現自動登陸(附視訊教程)
驗證碼有圖形驗證碼、極驗滑動驗證碼、點觸驗證碼、宮格驗證碼。這回重點講講圖形驗證碼的識別。 雖說圖形驗證碼最簡單,但是對於我這等新手,還是要苦學一番。首先尋找測試網站,網站選的是如雲閣小說網,小網站不怕被封。他們的驗證碼一般如下:視訊教程: &n
java 根據OU獲取Windows的AD域賬戶
import java.util.Hashtable; import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; im
VS2013的LINK2005問題解決方案(僅限由第三方庫造成的問題)+ 附LNK2038
最近蕩的別人的程式碼做大作業,結果各種問題層出不窮,非常鬱悶,本想著泡泡通過直接上交,卻沒想到陷入無解狀態,好在查了各種部落格之後,終於找到了解決方案,現記錄如下。(由於小白一枚,用語不嚴謹,以理解問題、解決問題為第一要義,請見諒) -------------------
記一次AD域共享訪問錯誤(There are Currently No Logon Servers Available)的解決過程
內容摘要:本文描述了一次典型的域問題故障處理過程,現記錄如下以供同僚們參考 背景 起因 失敗狀態 解決思路 解決 結論 背景 起因 公司內有兩個獨立的域分別為:domA.contoso.com domB.contoso.
CCLabelTTF的多行顯示(僅限中文)
這個標題叫setDimensions的坑更貼切。緣起想要弄個自動換行的對話方塊功能,就想到了如何自動換行。 看到一個叫setDimensions的函式,設定可以顯示的區域,超出部分進行換行.在網上找過一些例子發現似乎真的神奇可以自動換行。 但是實際上新建一個HelloWor
flask+jsonp跨域前後臺交互(接口初體驗)
script keys 返回 == 方法 png 前後臺 true run 1 # -*- coding: utf-8 -*- 2 from flask import Flask, jsonify 3 import psutil, time,json 4 5
免費分享Navicat12各版本破解(僅供學習使用)
到你 比較 各版本 安裝 學習 英文 找到 ges 方法 花了幾個小時終於找到比較“綠色”的安裝包了。。。(無力吐槽下現在網上好多掛羊頭賣狗肉的網站) https://pan.baidu.com/s/1geMIkfT 密碼:9a98 裏面有安裝教程,不過我沒看懂,自
winrar5.50去廣告教程(僅供學習使用)
.exe href resource db2 目錄 chinese BE targe color https://blog.csdn.net/EnigmCode/article/details/78328873 第一步:到WinRAR官網www.rarlab.com
程序自動分析(並查集+排序)
ons printf 需要 排序 urn cst 如果 ont ace 題意 給許多個x,y,k,若k=1,x==y,否則x!=y,如果矛盾,輸出NO,否則YES 對於k=1,並查集簡單操作一下,k=0,如果find(x)==find(y),打個標記,輸出NO; 有一個需要
程式自動分析 (hash + 並查集)
在實現程式自動分析的過程中,常常需要判定一些約束條件是否能被同時滿足。 考慮一個約束滿足問題的簡化版本:假設$$x_1$$,$x_2$,$x_3$,…代表程式中出現的變數,給定n個形如$x_i=x_j$或$x_i≠x_j$的變數相等/不等的約束條件,請判定是否可以分別為每一個變數賦予恰當的值,使得上述所有約
Word報告自動生成(例如 匯出資料庫結構)
將很早之前寫的一個小元件重新整理優化一下,做成一個通用的功能。適用於匯出資料庫的結構(表、欄位等)到Word或將體檢資料自動生成Word版的體檢報告等。程式碼:Github 一、主要需要完成功能: 1. 靈活的配置規則及word樣式設定(文字、表格、
Java學習(權限修飾符)
vat ble align def bsp nbsp protected height cte Java中有4中權限修飾符 public protected (default) private 同一個類 √ √ √ √ 同一個包 √ √ √ × 不
IntelliJ IDEA熱載入自動更新(Update classes and resources )
IntelliJ IDEA預設檔案是自動儲存的,但是手頭有個專案jsp檔案改動後,在tomcat中不能立即響應變化。想要jsp檔案改動後立刻看到變化,可以通過修改配置來實現。 在IDEA tomcat 中server的配置裡,有個On frame deact