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

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

使用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

标签:spring,权限认证
0
投稿

猜你喜欢

  • Java获取用户IP属地模拟抖音详解

    2023-04-18 02:01:29
  • Android实现拼图小游戏

    2023-03-01 11:25:46
  • C#读取Excel到DataTable的方法示例

    2023-04-28 07:04:32
  • J2SE基础之命令行中编写第一个 Hello World

    2023-10-05 09:43:55
  • java基础检查和未检查异常处理详解

    2023-10-25 11:10:25
  • Java超详细讲解设计模式中的命令模式

    2023-07-26 15:23:11
  • Java 如何将网络资源url转化为File文件

    2023-05-28 09:23:37
  • 关于C#中yield return用法的思考

    2021-11-30 14:05:40
  • Android SharedPreferences存取操作以及封装详解

    2022-11-02 07:10:19
  • Spring AOP原理及动态代理

    2023-06-19 18:59:56
  • 详解MyBatis配置typeAliases的方法

    2023-11-29 06:21:52
  • WPF实现环(圆)形菜单的示例代码

    2022-05-07 18:46:34
  • Android EditText 监听用户输入完成的实例

    2022-06-22 18:41:54
  • C#中的虚方法和抽象方法的运用

    2023-06-02 15:49:40
  • 解决Android 5.1限制外置SD卡写入权限的问题

    2021-08-05 03:54:41
  • Java数据结构与算法之稀疏数组与队列深入理解

    2022-05-31 06:33:11
  • Java的关键字与保留字小结

    2021-05-30 10:20:50
  • Flutter如何轻松实现动态更新ListView浅析

    2023-05-23 09:32:37
  • C# WinForm制作登录界面的实现步骤

    2022-09-06 18:32:54
  • SpringBoot使用GraphQL开发Web API实现方案示例讲解

    2023-05-17 16:50:22
  • asp之家 软件编程 m.aspxhome.com