BDF2提供的默認登錄頁面如下:

可以用簡單和簡陋兩個詞來形容,之所以這樣,是因為我們在設(shè)計之初就考慮程序員在使用的時候可能90%以上都會用自己的登錄頁面將其替換,所以就沒做那么花哨,總的來說,BDF2當中很多功能用戶都可以替換,替換的方法和理論多數(shù)都是一樣的,那就是通過在WEB-INF/dorado-home/configure.propertie文件中覆蓋對應的屬性值,替換登錄頁面就是采用這種套路。
當用戶在訪問一個需要用戶信息的頁面時,系統(tǒng)就會自動跳轉(zhuǎn)到登錄頁面,要求用戶登錄,這個頁面地址取自一個名為“bdf2.formLoginUrl”的屬性值,這個值默認為/bdf2.core.view.frame.Login.d,也就是上圖展示的頁面。同樣,如果我們要采用自己的登錄頁面,方法就是在WEB-INF/dorado-home/configure.propertie文件中,重新為bdf2.formLoginUrl屬性指定一個新的URL即可。
比如,我們這里為bdf2.formLoginUrl屬性指定的URL為/login.jsp,同時設(shè)置bdf2.loginFailureTargetUrl屬性值也是/login.jsp(登錄失敗后跳轉(zhuǎn)的頁面,這里表示登錄失敗后還是跳轉(zhuǎn)到我們這里的login.jsp),這就表示我們將采用web應用根目錄下的一個名為login.jsp的頁面作為系統(tǒng)的登錄頁面,該頁面代碼如下:
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的程序員都知道,這個頁面非常簡單,只有一個form表單,這個form表單action屬性值為"security_check_",表示我們的表單將提交到這個URL,之前我們提過,登錄處理頁面的URL實際上由一個名為bdf2.loginProcessUrl的屬性決定,而這個屬性的默認值為/security_check_,所以如果你修改了這個屬性,那么這里的action值就應該是你修改后的值;最后設(shè)置form的method屬性為post,這個很重要,對于BDF2來說,處理登錄登錄,只接受post過來的請求,也就是說如果你不為form設(shè)置method屬性(默認為get)或設(shè)置method屬性值為get,這個處理登錄請求的URL是不會處理的,原因很簡單,因為get方式請求你的username與password就會被拼裝在URL后面,毫無安全性可言了。
在這個form表單里,我們設(shè)置了兩個文本域:一個是用戶名,一個是密碼。這里需要注意的是用戶名文本域的name值一定要是username_,密碼一定要是password_,否則處理登錄的URL將無法獲取提交的用戶名、密碼信息。
再次運行系統(tǒng),選擇登錄,就可以看到我們剛才定義的登錄頁面login.jsp,輸入注冊的用戶名,密碼,發(fā)現(xiàn)登錄不了,同時也沒有任何錯誤消息,為了知道究竟出了什么樣的錯誤,我們需要進一步修改我們的login.jsp,添加登錄失敗后的錯誤消息顯示功能,修改好的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)境中取錯誤消息的代碼塊,具體這里就不再解釋了。再次運行輸入用戶名密碼,點擊登錄,可以看到如下圖所示的帶提示錯誤消息的登錄頁面。

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

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