BDF2提供的默認(rèn)登錄頁(yè)面如下:

可以用簡(jiǎn)單和簡(jiǎn)陋兩個(gè)詞來(lái)形容,之所以這樣,是因?yàn)槲覀冊(cè)谠O(shè)計(jì)之初就考慮程序員在使用的時(shí)候可能90%以上都會(huì)用自己的登錄頁(yè)面將其替換,所以就沒(méi)做那么花哨,總的來(lái)說(shuō),BDF2當(dāng)中很多功能用戶都可以替換,替換的方法和理論多數(shù)都是一樣的,那就是通過(guò)在WEB-INF/dorado-home/configure.propertie文件中覆蓋對(duì)應(yīng)的屬性值,替換登錄頁(yè)面就是采用這種套路。
當(dāng)用戶在訪問(wèn)一個(gè)需要用戶信息的頁(yè)面時(shí),系統(tǒng)就會(huì)自動(dòng)跳轉(zhuǎn)到登錄頁(yè)面,要求用戶登錄,這個(gè)頁(yè)面地址取自一個(gè)名為“bdf2.formLoginUrl”的屬性值,這個(gè)值默認(rèn)為/bdf2.core.view.frame.Login.d,也就是上圖展示的頁(yè)面。同樣,如果我們要采用自己的登錄頁(yè)面,方法就是在WEB-INF/dorado-home/configure.propertie文件中,重新為bdf2.formLoginUrl屬性指定一個(gè)新的URL即可。
比如,我們這里為bdf2.formLoginUrl屬性指定的URL為/login.jsp,同時(shí)設(shè)置bdf2.loginFailureTargetUrl屬性值也是/login.jsp(登錄失敗后跳轉(zhuǎn)的頁(yè)面,這里表示登錄失敗后還是跳轉(zhuǎn)到我們這里的login.jsp),這就表示我們將采用web應(yīng)用根目錄下的一個(gè)名為login.jsp的頁(yè)面作為系統(tǒng)的登錄頁(yè)面,該頁(yè)面代碼如下:
login.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用戶登錄</title>
</head>
<body>
<h1>登錄</h1>
<form action="security_check_" method="post">
用戶名:<input type="text" name="username_"><br>
密碼:<input type="password" name="password_"><br>
<input type="submit" value="登錄">
</form>
</body>
</html>
熟悉HTML的程序員都知道,這個(gè)頁(yè)面非常簡(jiǎn)單,只有一個(gè)form表單,這個(gè)form表單action屬性值為"security_check_",表示我們的表單將提交到這個(gè)URL,之前我們提過(guò),登錄處理頁(yè)面的URL實(shí)際上由一個(gè)名為bdf2.loginProcessUrl的屬性決定,而這個(gè)屬性的默認(rèn)值為/security_check_,所以如果你修改了這個(gè)屬性,那么這里的action值就應(yīng)該是你修改后的值;最后設(shè)置form的method屬性為post,這個(gè)很重要,對(duì)于BDF2來(lái)說(shuō),處理登錄登錄,只接受post過(guò)來(lái)的請(qǐng)求,也就是說(shuō)如果你不為form設(shè)置method屬性(默認(rèn)為get)或設(shè)置method屬性值為get,這個(gè)處理登錄請(qǐng)求的URL是不會(huì)處理的,原因很簡(jiǎn)單,因?yàn)間et方式請(qǐng)求你的username與password就會(huì)被拼裝在URL后面,毫無(wú)安全性可言了。
在這個(gè)form表單里,我們?cè)O(shè)置了兩個(gè)文本域:一個(gè)是用戶名,一個(gè)是密碼。這里需要注意的是用戶名文本域的name值一定要是username_,密碼一定要是password_,否則處理登錄的URL將無(wú)法獲取提交的用戶名、密碼信息。
再次運(yùn)行系統(tǒng),選擇登錄,就可以看到我們剛才定義的登錄頁(yè)面login.jsp,輸入注冊(cè)的用戶名,密碼,發(fā)現(xiàn)登錄不了,同時(shí)也沒(méi)有任何錯(cuò)誤消息,為了知道究竟出了什么樣的錯(cuò)誤,我們需要進(jìn)一步修改我們的login.jsp,添加登錄失敗后的錯(cuò)誤消息顯示功能,修改好的login.jsp代碼如下:
new login.jsp
<%@page import="org.apache.commons.lang.StringUtils"%>
<%@page import="org.springframework.security.web.WebAttributes"%>
<%@page import="com.bstek.bdf2.core.context.ContextHolder"%>
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>用戶登錄</title>
</head>
<body>
<h1>登錄</h1>
<%!
private String getAuthenticationExceptionMessage(){
Exception
exp=(Exception)ContextHolder.getHttpSession().getAttribute(WebAttributes.AUTHENTICATION_EXCEPT
ION);
if(exp==null){
exp=(Exception)ContextHolder.getRequest().getAttribute(WebAttributes.AUTHENTICATION_EXCEPTION
);
}
if(exp!=null){
return exp.getMessage();
}
return null;
}
%>
<%
String error=getAuthenticationExceptionMessage();
if(StringUtils.isNotEmpty(error)){
out.println("Login Error:"+error);
}
%>
<form action="security_check_" method="post">
用戶名:<input type="text" name="username_"><br>
密碼:<input type="password" name="password_"><br>
<input type="submit" value="登錄">
</form>
</body>
</html>
我們添加了從環(huán)境中取錯(cuò)誤消息的代碼塊,具體這里就不再解釋了。再次運(yùn)行輸入用戶名密碼,點(diǎn)擊登錄,可以看到如下圖所示的帶提示錯(cuò)誤消息的登錄頁(yè)面。

從錯(cuò)誤消息當(dāng)中我們得知,原來(lái)登錄是需要驗(yàn)證碼的,如果我們希望登錄不要檢測(cè)驗(yàn)證碼該怎么辦呢?方法還是添加屬性,我們?cè)赪EB-INF/dorado-home/configure.propertie文件中添加一名為bdf2.useCaptchaForLogin屬性,通過(guò)之前的屬性列表中描述我們得知,它的作用就是決定在登錄時(shí)是否檢查驗(yàn)證碼的,它默認(rèn)值為true,表示需要檢查,所以才出現(xiàn)上圖的錯(cuò)誤,這里我們?cè)O(shè)置bdf2.useCaptchaForLogin=false,再次運(yùn)行應(yīng)用,輸入賬號(hào)信息登錄,可以看到能正常進(jìn)行主界面啦。
這個(gè)時(shí)候,可能有些程序在想,如果我在登錄的時(shí)候需要驗(yàn)證碼又該如何處理呢?
如果登錄的時(shí)候,需要啟用驗(yàn)證碼,那就要在你的登錄頁(yè)面中添加驗(yàn)證碼,從前面的屬性描述表中我們得知,生成驗(yàn)證碼圖片的地址由名為bdf2.generateCaptchaUrl的屬性決定,這個(gè)屬性默認(rèn)值為/generate.captcha,所以可以修改我們的登錄表單,添加驗(yàn)證碼圖片,修改后的表單代碼如下:
添加驗(yàn)證碼
<form action="security_check_" method="post">
用戶名:<input type="text" name="username_"><br>
密碼:<input type="password" name="password_"><br>
驗(yàn)證碼:<input type="text" name="captcha_"><img
src="generate.captcha.action?width=150&height=60"><br>
<input type="submit" value="登錄">
</form>
上述代碼當(dāng)中,我們添加了一個(gè)名為loginCaptch的文本域,同時(shí)添加了一個(gè)用于顯示驗(yàn)證碼圖片的img標(biāo)記,這個(gè)img的src屬性值為:generate.captcha.action?width=120&height=50&key=loginCaptch,這個(gè)地址當(dāng)中g(shù)enerate.captcha為bdf2.generateCaptchaUrl的屬性指定,需要注意的是它以.action結(jié)尾,后面我們會(huì)提到,這個(gè).action結(jié)尾的URL是BDF2中提供的了一種簡(jiǎn)單實(shí)用的Controller的URL地址,URL后面有兩個(gè)參數(shù)分別用于指定圖片的寬度和高度,修改我們之前設(shè)置的bdf2.useCaptchaForLogin屬性值為true。再次運(yùn)行我們的系統(tǒng),點(diǎn)擊登錄,可以看到如下效果的登錄頁(yè)面:

輸入用戶名、密碼及驗(yàn)證碼就可以成功登錄了。
某些情況下,我們可能需要在登錄的時(shí)候讓在瀏覽器的cookie當(dāng)中記錄我們的登錄信息(這個(gè)功能在某些論壇或購(gòu)物網(wǎng)站中出現(xiàn)的頻率比較高),BDF2同樣提供了這種功能的支持,再次修改我們的登錄表單,添加登錄記憶功能,修改好的表單代碼如下:
添加自動(dòng)登錄功能的登錄表單
<form action="security_check_" method="post">
用戶名:<input type="text" name="username_"><br>
密碼:<input type="password" name="password_"><br>
驗(yàn)證碼:<input type="text" name="captcha_"><img
src="generate.captcha.action?width=150&height=60"><br>
自動(dòng)登錄:<input type="checkbox" name="remember_me_"><br>
<input type="submit" value="登錄">
</form>
我們添加了一個(gè)checkbox,并且它的名字是"remember_me_",這樣在登錄的時(shí)候勾上這個(gè)checkbox,登錄成功以后,關(guān)掉瀏覽器,然后再打開(kāi)瀏覽器,輸入主界面地址,可以看到系統(tǒng)不再?gòu)棾龅卿涰?yè)面,直接成功登錄了。
好了,登錄頁(yè)面的擴(kuò)展功能就是這些,其它的諸如美化的工作程序員可以自己考慮靈活添加,這里就不再贅述了。
圖片等資源的采用
在自定義登錄界面時(shí),如果需要采用一些圖片之類的資源,且將圖片資源放在了web應(yīng)用的根的某個(gè)目錄下,那么需要通過(guò)設(shè)置以允許這
些資源在不登錄的情況下就可以訪問(wèn),設(shè)置方法是打開(kāi)我們的dorado-home/datasources.xml文件,在其中添加如下配置即可:
<bdf:anonymous-url urlPattern="/images/*.jpg"/>
上述配置就標(biāo)明位于web應(yīng)用的根的images目錄下所有以.jpg結(jié)尾的文件可以在不登錄情況下訪問(wèn),如果要設(shè)置其它的資源也可以采用
類似方式,如果有其它多種類型文件,那么就多加幾條這個(gè)配置即可。需要注意的是,對(duì)于Java來(lái)說(shuō)文件名后綴是區(qū)分大小寫(xiě)的,所以
這里在以文件名后綴來(lái)判斷是否可以匿名訪問(wèn)時(shí)需要注意大小寫(xiě)。
更多建議: