【struts2+hibernate+spring專案實戰】實現使用者登入功能(ssh)
阿新 • • 發佈:2019-02-11
一、概述
從今天才開始有時間來總結總結以前自己練習的一些東西,希望總結出來對以後可以更加便捷的來學習,也希望可以幫助到正需要這些東西的同行人,一起學習,共同進步。
二、 登入功能總結
2.1、登入功能概述
這個技術主要是運用Struts2+hibernate+spring的技術來進行登入功能的實現的,並且是在一個具體的專案中來實現的,對於以後的借鑑能夠提供便捷。
2.2、具體實現
2.2.1、登入頁面的實現
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<%@taglib prefix="s" uri="/struts-tags"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="css/index.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery-1.8.3.js"></script>
<title>贛師大qualitycontrol-系統登入頁</title>
<script>
$(function() {
$("#login_ok").click(function() {
$("form:first").submit();
});
});
function MM_swapImage(srcObj,image_src){
srcObj.src=image_src;
}
</script>
</head>
<body>
<s:actionerror/>
<div class="container-login">
<div class="login-pic">
<div class="login-text">
<s:form action="emp_login" method="post">
<table width="100%" border="0" cellpadding="0" cellspacing="0">
<tr>
<td width="19%" height="28">使用者名稱:</td>
<td colspan="2">
<s:textfield name="em.userName" size="18" value="admin"/>
</td>
</tr>
<tr>
<td height="31">密 碼:</td>
<td colspan="2">
<s:textfield name="em.pwd" size="18" value="admin"/>
</td>
</tr>
<tr>
<td height="30">驗證碼:</td>
<td width="43%">
<input type="text" size="9" />
</td>
<td width="32%"><img src="images/test.gif" />
</td>
</tr>
<tr>
<td height="30"> </td>
<td colspan="2">
<a href="javascript:void(0)" id="login_ok">
<img src="images/denglu_bg_03.gif"
name="Image1" width="40"
height="22" border="0"
onmouseover="MM_swapImage(this,'images/denglu_h_03.gif')"
onmouseout="MM_swapImage(this,'images/denglu_bg_03.gif')" /></a>
<a href="#">
<img src="images/giveup_bg_03.gif"
name="Image2" width="42"
height="22" border="0"
onmouseover="MM_swapImage(this,'images/giveup_h_03.gif')"
onmouseout="MM_swapImage(this,'images/giveup_bg_03.gif')" /></a>
</td>
</tr>
</table>
</s:form>
</div>
</div>
</div>
</body>
</html>
在這裡的一部分,主要是頁面的回顯和驗證碼的顯示s:textfield name="em.userName" size="18" value="admin"/>
。
2.2.2、action的實現
//登入
public String login(){
HttpServletRequest request = getRequest();
String loginIp = request.getHeader("x-forwarded-for");
if(loginIp == null || loginIp.length() == 0 || "unknown".equalsIgnoreCase(loginIp)) {
loginIp = request.getHeader("Proxy-Client-IP");
}
if(loginIp == null || loginIp.length() == 0 || "unknown".equalsIgnoreCase(loginIp)) {
loginIp = request.getHeader("WL-Proxy-Client-IP");
}
if(loginIp == null || loginIp.length() == 0 || "unknown".equalsIgnoreCase(loginIp)) {
loginIp = request.getRemoteAddr();
}
EmpModel loginEm = empEbi.login(em.getUserName(),em.getPwd(),loginIp);
if(loginEm == null){
this.addActionError("對不起,使用者名稱密碼錯誤!");
return "loginFail";
}else{
//在登入成功的時候,查詢該使用者的所有許可權
List<ResModel> resList = resEbi.getResByEm(loginEm.getUuid());
StringBuilder sbf = new StringBuilder();
for (ResModel rm : resList) {
sbf.append(rm.getText());
sbf.append(",");
}
// System.out.println("11111111111111");
// System.out.println(sbf.toString()+"=="+loginEm.getUuid());
// System.out.println("11111111111111");
loginEm.setResAll(sbf.toString());
putSession(EmpModel.EMP_LOGIN_USER_OBJECT_NAME, loginEm);
return "loginSuccess";
}
}
2.2.3、service實現
public EmpModel login(String userName, String pwd,String lastLoginIp) {
//MD5加密
pwd = MD5Utils.md5(pwd);
//呼叫資料層
EmpModel loginEm = empDao.getByUserNameAndPwd(userName,pwd);
if(loginEm != null){
//登入成功
//新增登入資訊
//登入次數+1
loginEm.setLoginTimes(loginEm.getLoginTimes()+1);
//最後登入時間
loginEm.setLastLoginTime(System.currentTimeMillis());
//最後登入IP
loginEm.setLastLoginIp(lastLoginIp);
//快照更新
}
return loginEm;
}
2.2.4、dao的實現
dao主要是通過使用者名稱和密碼來查詢這個使用者是否存在
public EmpModel getByUserNameAndPwd(String userName, String pwd) {
String hql ="from EmpModel where userName = ? and pwd = ?";
List<EmpModel> temp = this.getHibernateTemplate().find(hql,userName,pwd);
return temp.size()>0 ? temp.get(0):null;
}
2.2.5、使用者實體類
package org.sihai.qualitycontrol.auth.emp.vo;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.sihai.qualitycontrol.auth.dep.vo.DepModel;
import org.sihai.qualitycontrol.auth.role.vo.RoleModel;
import org.sihai.qualitycontrol.util.format.FormatUtil;
public class EmpModel {
public static final String EMP_LOGIN_USER_OBJECT_NAME = "loginEm";
//資料結構思想應用
public static final Integer EMP_GENDER_OF_MAN = 1;
public static final Integer EMP_GENDER_OF_WOMAN = 0;
public static final String EMP_GENDER_OF_MAN_VIEW = "男";
public static final String EMP_GENDER_OF_WOMAN_VIEW = "女";
public static final Map<Integer, String> genderMap = new HashMap<Integer, String>();
static{
genderMap.put(EMP_GENDER_OF_MAN, EMP_GENDER_OF_MAN_VIEW);
genderMap.put(EMP_GENDER_OF_WOMAN, EMP_GENDER_OF_WOMAN_VIEW);
}
private Long uuid;
private String userName;
private String name;
private String pwd;
private String email;
private String tele;
private String address;
private String lastLoginIp;
private Integer loginTimes;
private Long lastLoginTime;
private Integer gender;
private String resAll;
public String getResAll() {
return resAll;
}
public void setResAll(String resAll) {
this.resAll = resAll;
}
/*
//Long:記錄的是毫秒值
//Date:對long的包裝 優點:格式好,缺點:計算時間略有複雜性
現在的時間是2020年4月31日
180天前是幾號?
現在的long System.currentTimeMillis()-180*24*60*60*1000
long-long >0
Date 2014年1月4日 14:21
Date 2014年1月4日 14:22
*/
private Long birthday;
private Set<RoleModel> roles;//多對多
public Set<RoleModel> getRoles() {
return roles;
}
public void setRoles(Set<RoleModel> roles) {
this.roles = roles;
}
//檢視值:檢視值是一種用於介面顯示的變數值,該值不具體對應某個資料庫欄位,它服務於某個資料庫欄位
//當資料庫中的某個欄位值不便於直接顯示時,為該欄位新增檢視值,用於顯示對應的資訊
//1.定義一個String型別的變數,變數名是無法合理顯示的欄位的欄位名+View
//2.提供其get方法
//3.在其對應的變數的set方法中對這個View值進行初始化
private String birthdayView;
private String genderView;
private String lastLoginTimeView;
public String getLastLoginTimeView() {
return lastLoginTimeView;
}
public String getLastLoginIp() {
return lastLoginIp;
}
public void setLastLoginIp(String lastLoginIp) {
this.lastLoginIp = lastLoginIp;
}
public Integer getLoginTimes() {
return loginTimes;
}
public void setLoginTimes(Integer loginTimes) {
this.loginTimes = loginTimes;
}
public Long getLastLoginTime() {
return lastLoginTime;
}
public void setLastLoginTime(Long lastLoginTime) {
this.lastLoginTime = lastLoginTime;
this.lastLoginTimeView = FormatUtil.formatDate(lastLoginTime);
}
public String getGenderView() {
return genderView;
}
public String getBirthdayView() {
return birthdayView;
}
//多對一
private DepModel dm;
public Long getUuid() {
return uuid;
}
public void setUuid(Long uuid) {
this.uuid = uuid;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getTele() {
return tele;
}
public void setTele(String tele) {
this.tele = tele;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
this.genderView = genderMap.get(gender);
}
public Long getBirthday() {
return birthday;
}
public void setBirthday(Long birthday) {
this.birthday = birthday;
this.birthdayView = FormatUtil.formatDate(birthday);
}
public DepModel getDm() {
return dm;
}
public void setDm(DepModel dm) {
this.dm = dm;
}
}
2.2.5.1、檢視值的用法
在實體類中通過對資料的轉化成頁面需要顯示的形式到頁面來顯示。
實體類中:
private String genderView;
//資料結構思想應用
public static final Integer EMP_GENDER_OF_MAN = 1;
public static final Integer EMP_GENDER_OF_WOMAN = 0;
public static final String EMP_GENDER_OF_MAN_VIEW = "男";
public static final String EMP_GENDER_OF_WOMAN_VIEW = "女";
public static final Map<Integer, String> genderMap = new HashMap<Integer, String>();
static{
genderMap.put(EMP_GENDER_OF_MAN, EMP_GENDER_OF_MAN_VIEW);
genderMap.put(EMP_GENDER_OF_WOMAN, EMP_GENDER_OF_WOMAN_VIEW);
}
//通過set方法,把性別的原本的0/1,轉為男或女在頁面顯示
public void setGender(Integer gender) {
this.gender = gender;
this.genderView = genderMap.get(gender);
}
頁面顯示:
${genderView}
2.2.5.2、Struts2中對map的取值
<s:select name="eqm.gender" list="@org.sihai.qualitycontrol.auth.emp.vo.EmpModel@genderMap" cssStyle="width:190px"
headerKey="-1" headerValue="----請-選-擇----"></s:select>
這裡的list的取值首先用額是Struts2的標籤,然後運用ognl表示式來在頁面上對map取值。
2.2.5.3、Struts2中對list的取值
<s:select name="eqm.dm.uuid" list="depList" listKey="uuid" listValue="name" cssStyle="width:190px"
headerKey="-1" headerValue="----請-選-擇----"></s:select>