1. 程式人生 > >AD域賬戶自動登陸(僅限IE瀏覽器)Java簡單實現

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