高校登錄界面預(yù)覽

高校教務(wù)處登錄界面
模擬登錄分析

登錄請(qǐng)求的信息
說(shuō)明:
Request URL 登錄請(qǐng)求的地址(固定)
Request Method 登錄請(qǐng)求的方式(固定)
Location 登錄成功后跳轉(zhuǎn)的頁(yè)面(請(qǐng)求返回的結(jié)果)
Cookie 當(dāng)前會(huì)話信息(第一次訪問(wèn)登錄界面,會(huì)返回一個(gè)Cookie信息)
Form Data 需要Post的參數(shù)
- __VIEWSTATE (固定)
txtUserName (學(xué)號(hào))
btnLogin.x (登錄按鈕點(diǎn)擊的位置)
btnLogin.y (登錄按鈕點(diǎn)擊的位置)
txtPassword (密碼)
CheckCode (驗(yàn)證碼) - __EVENTVALIDATION (固定)
使用Spring Boot 開(kāi)發(fā)模擬登錄功能
效果圖

自己開(kāi)發(fā)的登錄界面
//模擬登陸的服務(wù)層
@Service
@Log4j
public class CtguService {
//登錄請(qǐng)求地址
private final static String LOGIN = "http://210.42.38.26:84/jwc_glxt/Login.aspx?__VIEWSTATE=%s&__EVENTVALIDATION=%s&txtUserName=%s&btnLogin.x=0&btnLogin.y=0&txtPassword=%s&CheckCode=%s";
//登錄界面
private final static String LOGIN_VIEW = "http://210.42.38.26:84/jwc_glxt/";
//驗(yàn)證碼請(qǐng)求地址
private final static String CHECK_CODE = "http://210.42.38.26:84/jwc_glxt/ValidateCode.aspx";
//固定的參數(shù)值(URL編碼)
private static final String VIEWSTATE = "%2FwEPDwUKMTQ4NjM5NDA3OWQYAQUeX19Db250cm9sc1JlcXVpcmVQb3N0QmFja0tleV9fFgEFCGJ0bkxvZ2luU077LK9itKNe3fhI7aoZZ%2BS5Ryo%3D";
private static final String EVENTVALIDATION = "%2FwEWBQKOmrqLAwKl1bKzCQKC3IeGDAK1qbSRCwLO44u1DVzfq830wXTY29pyqB1kTMdgWLfG";
private Map<String, String> cookies;
//驗(yàn)證碼
private byte[] checkPic;
//模擬訪問(wèn)登錄界面
public void getCookiesFromJwc(){
try {
//第一次訪問(wèn)登錄界面
Response response = Jsoup.connect(LOGIN_VIEW).timeout(60000).execute();
//得到系統(tǒng)返回的Cookies
cookies = response.cookies();
//請(qǐng)求獲得驗(yàn)證碼的內(nèi)容
checkPic = Jsoup.connect(CHECK_CODE).cookies(cookies).ignoreContentType(true).execute().bodyAsBytes();
} catch (IOException e) {
e.printStackTrace();
}
}
//登錄校驗(yàn)
public boolean loginCheck(String username, String password, String checkCode){
try {
String loginUrl = String.format(LOGIN, VIEWSTATE, EVENTVALIDATION, username, password, checkCode);
log.info("學(xué)號(hào):" + username + " 密碼:" + password);
Document document = Jsoup.connect(loginUrl).cookies(cookies).timeout(60000).ignoreContentType(true).get();
//登錄成功后,返回的Document有此節(jié)點(diǎn),作為是否登錄成功的依據(jù)
Elements elements = document.select("span#ctl00_lblSignIn");
if (!elements.isEmpty()){
return true;
}
} catch (IOException e) {
e.printStackTrace();
}
return false;
}
public byte[] getCheckPic(){
return checkPic;
}
}
//模擬登錄視圖層
@Controller
public class HomeController {
@Autowired
private CtguService ctguService;
//登錄界面
@RequestMapping("login")
public String login(Model model){
ctguService.getCookiesFromJwc();
return "login";
}
//驗(yàn)證碼顯示
@RequestMapping("/ctgu/check")
public void getPic(HttpServletResponse response) throws IOException {
byte[] picBytes = ctguService.getCheckPic();
response.setContentType("image/png");
OutputStream stream = response.getOutputStream();
stream.write(picBytes);
stream.flush();
stream.close();
}
}
//html前端代碼
<p class="lead col-md-6 col-sm-12 col-md-offset-3">
<input type="text" id="username" placeholder="學(xué)號(hào)" class="form-control">
</p>
<p class="lead col-md-6 col-sm-12 col-md-offset-3">
<input type="text" id="password" placeholder="教務(wù)處密碼" class="form-control">
</p>
<p class="lead col-md-6 col-sm-10 col-md-offset-3">
<input type="text" id="checkCode" placeholder="驗(yàn)證碼" class="form-control">
</p>
<p class="lead col-md-2 col-sm-2">
<img th:src="@{/ctgu/check}" style="border-width:0px;">
</p>
<p class="lead col-md-6 col-sm-12 col-md-offset-3">
<a href="#" class="btn btn-lg btn-success" id="signIn">注冊(cè)</a>
</p>
疑點(diǎn)
支持高并發(fā)的話,應(yīng)該要對(duì)Service層的Cookies 和 checkPic額外處理,這就留給讀者們?nèi)ニ伎剂?,并發(fā)量不大的話,這樣處理就沒(méi)什么問(wèn)題了
補(bǔ)充
- 個(gè)人原因,不能提供完整項(xiàng)目代碼,有問(wèn)題可以留言;
- 核心框架SpringBoot,依賴了Jsoup 和 Lombok;
- 中間有很多細(xì)節(jié),為什么要在拿到cookie后直接去獲取驗(yàn)證碼?不獲取會(huì)發(fā)生?有興趣的可以自行嘗試