软件编程
位置:首页>> 软件编程>> java编程>> 详解使用Spring3 实现用户登录以及权限认证

详解使用Spring3 实现用户登录以及权限认证

作者:huimingBall  发布时间:2023-05-07 03:59:12 

标签:spring,权限认证

使用Spring3 实现用户登录以及权限认证

这里我就简单介绍一下,我在实现的时候处理的一些主要的实现。

1.用户登录


<form action="loginAction.do" method="post">
 <div class="header">
 <h2 class="logo png"></h2>
 </div>
 <ul>
       <li><label>用户名</label><input name="username" type="text" class="text"/></li>
       <li/>
       <li><label>密码</label><input name="password" type="password" class="text" /></li>  
       <li/>
       <li class="submits">
         <input class="submit" type="submit" value="登录" />
       </li>
 </ul>
 <div class="copyright">&copy; 2013 - 2014 |</div>
</form>

以上是前台页面,后台的就是一个简单的逻辑实现:


   @RequestMapping(value="loginAction.do", method=RequestMethod.POST)
public ModelAndView loginAction(@RequestParam(value="username") String username, @RequestParam(value="password") String password, HttpSession session, HttpServletResponse resp, @RequestParam(value="savetime", required=false) String savetime) {
 session.removeAttribute(LogConstant.LOGIN_MESSAGE);
 SystemUserDataBean user = userDao.getSystemUserByUserName(username);
 ModelAndView view = null;
 if(user == null) {
   view = new ModelAndView(new RedirectView("login.html"));
   session.setAttribute(LogConstant.LOGIN_MESSAGE, "用户名不正确");
   return view;
 }
 boolean isPasswordCorrect = EncryptionUtil.compareSHA(password, user.getPassword());
 if(isPasswordCorrect){
   session.setAttribute(LogConstant.CURRENT_USER, username);

} else{
   view = new ModelAndView(new RedirectView("login.html"));
   session.setAttribute(LogConstant.LOGIN_MESSAGE, "密码不正确");
 }

return view;
}

2.登录信息

这里,在登录页面有一段JavaScript,来显示密码错误等信息:


<script type="text/javascript">
var login_username_info = '<%=request.getSession().getAttribute("currentUser") == null ? "" : request.getSession().getAttribute("currentUser")%>';
var login_message_info = '<%=request.getSession().getAttribute("login_message") == null ? "" : request.getSession().getAttribute("login_message")%>';
if(login_message_info != null && login_message_info != ''){
 alert(login_message_info);
}

</script>

3.拦截未登录用户的请求

这里,从页面和后台实现了双重拦截:

页面代码如下:


<%
if(session.getAttribute("currentUser")==null){
%>
window.parent.location='login.html';
<%
}
%>

后台是一个 * (servlet-config.xml):


<!-- * -->  
 <mvc:interceptors>  
   <mvc:interceptor>  
     <mvc:mapping path="/*.do" />  
     <bean class="com..log.report.interceptor.AccessStatisticsIntceptor" />  
   </mvc:interceptor>  
 </mvc:interceptors>  

* 的实现是


import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class AccessStatisticsIntceptor implements HandlerInterceptor {
@Override
 public void afterCompletion(HttpServletRequest arg0,
     HttpServletResponse arg1, Object arg2, Exception arg3)
     throws Exception {
   // TODO Auto-generated method stub

}

@Override
 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
     Object arg2, ModelAndView arg3) throws Exception {
   // TODO Auto-generated method stub

}

@Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
     Object obj) throws Exception {

String uri = request.getRequestURI().substring(request.getRequestURI().lastIndexOf("/") +1);
   if(!AuthorityController.isAuthorized(uri, request.getSession())) {
     //校验失败
     return false;
//     throw new CustomException(LogConstant.USER_NOT_LOGIN);
   }
     return true;
}

具体如何校验的,会根据用户的权限,就不介绍了

4.返回未登录前访问的页面

首先在页面添加一段脚本,使用jQuery去访问后台


   var page = "";
var loc = decodeURIComponent(window.parent.location);
var start = loc.indexOf("Log/") + 8;
var end = loc.indexOf(".html");
page = loc.substr(start, end-start);
if(page != null && page != '') {
 alert(page);
 $.ajax({
   type : "get",
   url : "setPreviousPageAction.do?previousPage=" + page + ".html",
   success : function(msg){  

}
 });
}

然后,后台有记录这个页面:


@RequestMapping(value="setPreviousPageAction.do")
public void setPreviousPageAction(@RequestParam(value="previousPage") String previousPage, HttpSession session){
 session.setAttribute(LogConstant.PREVIOUS_PAGE, previousPage);
}

在登录完成后,返回这个页面即可。

5.保存用户名密码

登录页面提供一个保存下拉框:


<select class="save_login" id="savetime" name="savetime">
 <option selected value="0">不保存</option>
 <option value="1">保存一天</option>
 <option value="2">保存一月</option>
 <option value="3">保存一年</option>
</select>

后台在登录时会操作,将信息保存在cookie中:


if(savetime != null) { //保存用户在Cookie
 int savetime_value = savetime != null ? Integer.valueOf(savetime) : 0;
 int time = 0;
 if(savetime_value == 1) { //记住一天
   time = 60 * 60 * 24;
 } else if(savetime_value == 2) { //记住一月
   time = 60 * 60 * 24 * 30;
 } else if(savetime_value == 2) { //记住一年
   time = 60 * 60 * 24 * 365;
 }
 Cookie cid = new Cookie(LogConstant.LOG_USERNAME, username);
 cid.setMaxAge(time);
 Cookie cpwd = new Cookie(LogConstant.LOG_PASSWORD, password);
 cpwd.setMaxAge(time);
 resp.addCookie(cid);
 resp.addCookie(cpwd);
}  

前台在发现用户未登录时,会取出cookie中的数据去登录:


if(session.getAttribute("currentUser")==null){
 Cookie[] cookies = request.getCookies();
 String username = null;
 String password = null;
 for(Cookie cookie : cookies) {
   if(cookie.getName().equals("log_username")) {
     username = cookie.getValue();
   } else if(cookie.getName().equals("log_password")) {
     password = cookie.getValue();
   }
 }
 if(username != null && password != null) {
   %>
   $.ajax({
     type : "post",
     url : "loginByCookieAction.do",
     data:"username=" + "<%=username%>"+ "&password=" + "<%=password%>",
     success : function(msg){  
       if(msg.status == 'success')
         window.parent.location.reload();
       else if(msg.status == 'failed')
         gotoLoginPage();
     }
   });
   <%
 } else {
   %>
   gotoLoginPage();
   <%
 }

...

以上就列出了我在解决登录相关问题的方法,代码有点长,就没有全部列出。

来源:http://blog.csdn.net/fover717/article/details/8525808

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com