1. 程式人生 > >【struts2+hibernate+spring專案實戰】實現使用者登入功能(ssh)

【struts2+hibernate+spring專案實戰】實現使用者登入功能(ssh)

一、概述

從今天才開始有時間來總結總結以前自己練習的一些東西,希望總結出來對以後可以更加便捷的來學習,也希望可以幫助到正需要這些東西的同行人,一起學習,共同進步。

二、 登入功能總結

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">密&nbsp;&nbsp;碼:</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">&nbsp;</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>