easyui+ssm+shiro做的登錄註冊修改密碼審覈用戶(二)

easyui+ssm+shiro做的登錄註冊修改密碼審覈用戶(二)

登錄頁面

用戶登錄:根據輸入用戶名密碼來判斷是否登錄成功,要有記住密碼功能,還要設置登錄超時功能

根據這張效果圖,我們可以需要一個form表單用來傳遞參數,參數一共有兩個,還有兩個按鈕

登錄的form表單代碼如下,前端通過ajax把name值傳給後臺

<div class="form-bottom" style="height:300px;">
	<form id="loginForm" action="${ctx }/shiroLogin" method="post" class="login-form">
		<div class="form-group">
			<label class="sr-only" for="form-username">用戶名</label>
			    <input type="text" name="username" placeholder="用戶名..." class="form-username form-control" id="form-username">
		</div>
		<div class="form-group">
			<label class="sr-only" for="form-password">密碼</label>
			    <input type="password" name="password" placeholder="密碼..." class="form-password form-control" id="form-password">
		</div>
			                     
		<!-- 記住密碼<input type="checkbox" name="remeberMe" value="1"> -->
		<div style="float:right;height:40px;">
			<input type="checkbox" id="remember" checked >記住密碼<br/><br/>
		</div>
			                       	 
		<button id="login" type="submit" class="btn" onclick="loginBtn_click()">登  錄</button>
		<p></p>    
   </form>
	<a style='color:blue' href='javascript:void(0)' title='註冊' onclick='register()'>用戶註冊</a>
		                        
	<div style="float:right;">
		<a style='color:blue' href='javascript:void(0)' title='修改密碼' onclick='updatePwd()'>修改密碼</a>
	</div>
</div>

可以看到form表單有個action屬性,action="${ctx }/shiroLogin",這就是傳入到後臺的接口

url: "/yhzn/shiroLogin"   shiroLogin登錄方法

data : {"username":username,"password":password}     用戶名和密碼參數

$.ajax({  
	type : "post", 
	url : "/yhzn/shiroLogin",  
	data : {"username":username,"password":password},  
	dataType : "json",  
		success : function(data) {
		   if(data.status == "y"){
		      window.location.href = "${ctx }/home";
		   }else{
			  alert("4324");
		   }
		},
		error: function(XMLHttpRequest, textStatus, errorThrown) {
           alert("error:"+textStatus);
        }  
});  

LoginController中的shiroLogin方法

	/**
	 * 登錄
	 * @param username
	 * @param password
	 * @return
	 */
	@RequestMapping("/shiroLogin")
	@ResponseBody
	public String login(@RequestParam String username, @RequestParam String password,HttpServletRequest request) {
		String msg = "";
		/*String ip=this.getRequest().getRemoteAddr();
		if(ip==null||ip.indexOf("10.", 0)<0)
		{
			return "{\"info\":\"IP不在允許範圍內!\",\"status\":\"n\"}";
		}*/
		Subject currentUser = SecurityUtils.getSubject();
		try {
			// 將用戶名和密碼封裝爲UsernamePasswordToken對象
			UsernamePasswordToken token = new UsernamePasswordToken(username,password);
			token.setRememberMe(true);
			currentUser.login(token);
			String hashAlgorithName = "MD5";
			Object credentials = password;
			Object salt = ByteSource.Util.bytes(username);
			int hashIterations = 1024;
			Object result = new SimpleHash(hashAlgorithName,credentials,salt,hashIterations);
		//	user.setPassword(String.valueOf(result));
			HashMap<String,String> para=new HashMap<String,String>();
			para.put("userName", username);
			para.put("password", String.valueOf(result));
			User user = userService.checkUser(para);
			
			if(user==null){
				msg = "{\"info\":\"用戶名或密碼錯誤!\",\"status\":\"n\"}";
			}else if("1".equals(user.getState())){
				msg = "{\"info\":\"該用戶未審覈!\",\"status\":\"n\"}";
			}else if(user.getRoleId()==null){
				msg = "{\"info\":\"該用戶未分配角色!\",\"status\":\"n\"}";
			}else{
				currentUser.isPermitted(username);	
				 String roleId= sysRoleService.findRolesByUserName(user.getUserName());
				List<Permission> permission = sysRoleService.permissionById(roleId);
				Set<String> biaoshi = userService.findPermissionsByUserName(user.getUserName());
				request.getSession().setAttribute("biaoshi", biaoshi);
				request.getSession().setAttribute("permission", permission);
				//獲取訪問者IP
			//String ip = this.getRequest().getRemoteAddr();
			//user.setLoginIp(ip);
			user.setLoginIp(getIp(request));
			//日誌類型,操作人,操作內容,操作人IP,操作方法
			sysLogService.insertSysLog("登錄",user.getTrueName(),"登錄系統",user.getLoginIp(),"/shiroLogin");
			this.getRequest().getSession().setAttribute("user", user);
				
			msg = "{\"info\":\"登錄成功!\",\"status\":\"y\"}";
			}
		} catch (UnknownAccountException e) {
			msg = "{\"info\":\"登錄失敗【用戶不存在】!\",\"status\":\"n\"}";
		} catch (IncorrectCredentialsException e) {
			msg = "{\"info\":\"登錄失敗【密碼錯誤】!\",\"status\":\"n\"}";
		} catch (LockedAccountException e) {
			msg = "{\"info\":\"登錄失敗【用戶已鎖】!\",\"status\":\"n\"}";
		} catch (AuthenticationException e) {
			msg = "{\"info\":\"登錄失敗【認證異常】!\",\"status\":\"n\"}";
		} catch (Exception e) {
			e.printStackTrace();
			msg = "{\"info\":\"用戶名或密碼錯誤!\",\"status\":\"n\"}";
		}
		return msg;
	}

UserService中的checkUser方法

    /**
	 * 用戶名密碼認證
	 */
	@Override
	public 	User checkUser(HashMap<String,String> para){
		return userDao.checkUser(para);
	}

UserDao中的checkUser方法

    /**
	 * 驗證用戶名密碼
	 * 
	 * @param para
	 * @return
	 */
	public User checkUser(HashMap<String, String> para);

 

UserDao.xml的根據用戶名和密碼查詢用戶的SQL語句

<!-- 驗證用戶名密碼 -->
	<select id="checkUser" parameterType="map" resultMap="BaseResultMap">
		select
		<include refid="Base_Column_List" />
		from SYS_USER
		where USER_NAME = #{userName}
		and PASSWORD =#{password}
		and DELETE_FLAG = '0'
	</select>

登錄超時提醒

現在web.xml裏面設置session超時時間

<!-- 設置session有效時間-->
<session-config>
   <session-timeout>15</session-timeout>
</session-config>

然後再到login.jsp頁面加上如下代碼

if(window != top) {
	alert("由於您長時間未操作,登錄信息已超時,請重新登錄!!!");
	top.location.href = "${ctx}/login";
} 

記住密碼

HTML5 提供了兩種在客戶端存儲數據的新方法:

  • localStorage - 沒有時間限制的數據存儲
  • sessionStorage - 針對一個 session 的數據存儲

之前,這些都是由 cookie 完成的。但是 cookie 不適合大量數據的存儲,因爲它們由每個對服務器的請求來傳遞,這使得 cookie 速度很慢而且效率也不高。

在 HTML5 中,數據不是由每個服務器請求傳遞的,而是隻有在請求時使用數據。它使在不影響網站性能的情況下存儲大量數據成爲可能。

對於不同的網站,數據存儲於不同的區域,並且一個網站只能訪問其自身的數據。

HTML5 使用 JavaScript 來存儲和訪問數據。

localStorage 方法存儲的數據沒有時間限制。第二天、第二週或下一年之後,數據依然可用。

<!-- 記住密碼
<input type="checkbox" name="remeberMe" value="1"> -->
	<div style="float:right;height:40px;">
	<input type="checkbox" id="remember" checked >記住密碼<br/><br/>
</div>
$(document).ready(function(){
	         var strName = localStorage.getItem('keyName');
	         var strPass = localStorage.getItem('keyPass');
	         if(strName){
	             $('#form-username').val(strName);
	         }if(strPass){
	             $('#form-password').val(strPass);
	         }
     	});

 

function loginBtn_click(){
             var strName = $('#form-username').val();
             var strPass = $('#form-password').val();
             localStorage.setItem('keyName',strName);
             if($('#remember').is(':checked')){
                 localStorage.setItem('keyPass',strPass);
             }else{
                 localStorage.removeItem('keyPass');
             }
         }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章