当前位置:首页 » 《关注互联网》 » 正文

ssm整合--免登录功能_努力的搬砖人

9 人参与  2022年01月21日 10:18  分类 : 《关注互联网》  评论

点击全文阅读


免登录功能

/*
* 10天免登录操作
*   第一部分业务:在登录的时候操作,login.do
*   1.用户登录,勾选10天免登录
*       i.给复选框一个标识,将标识传递到后台
*       ii.后台接收到标识后,开始进行免登录操作
*   2.将用户名和密码存入cookie中(传统项目可以,金融/电商不允许这样操作)
*     安全问题?
*       i.拦截器会拦截其他请求,只放行了登录请求和跳转到登录页面的请求
*       ii.由于在我们输入密码以后,会对密码进行MD5加密操作,
*           故存入cookie中的数据都是加密后的数据,即使加密后的数据泄漏,也无法登录,
*           因为在登录时会对密码再次加密,二次加密后的密码,与数据库中的密码无法对应
*   3.设置cookie的一些属性:
*       i.cookie过期时间:60*60*24*10  10天
*       ii.cookie的存放路径:/ 根目录下,保证在任意路径下都能访问到cookie中的数据
*
*   第二部分业务:对跳转到登录页面的请求进行操作,toLogin.do
*   4.获取cookie中的用户名和密码
*   5.自动进行登录
*       调用service.login()方法进行登录
*   6.将自动登录后的用户存入session中
*
*/
  1. 拦截器

    在web.xml中配置

    <!--
    	欢迎页面
    	当访问http://127.0.0.1:8080/crm时,会自动找到index.jsp
    -->
    <welcome-file-list>
        <welcome-file>/index.jsp</welcome-file>
    </welcome-file-list>
    

    在index.jsp中配置

    <!--跳转到登录页面-->
    <script type="text/javascript">
       document.location.href = "settings/user/toLogin.do";
    </script>
    

    在applicationContext-web.xml中配置

    <!--
        权限控制的拦截器
    -->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--对所有的请求都拦截-->
            <mvc:mapping path="/**"/>
            <!--对登录请求放行-->
            <mvc:exclude-mapping path="/settings/user/login.do"/>
            <!--对跳转到登录页面的请求放行-->
            <mvc:exclude-mapping path="/settings/user/toLogin.do"/>
            <!--注册的拦截器-->
            <bean class="com.mryang.crm.interceptor.LoginInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>
    

    在拦截器中设置

    public class LoginInterceptor implements HandlerInterceptor {
    
        /**
         * 控制器方法执行 之前 执行的方法
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
            // 只有用户登录后才放行
            User user = (User) request.getSession().getAttribute("user");
            if (user == null){//用户未登录,抛出异常
                // 异常处理器会帮我们重定向到登录页面 
                // InterceptorException():自定义异常
                throw new InterceptorException();
            }
            return true;
        }
    
        /**
         * 控制器方法执行 之后 执行的方法
         */
        @Override
        public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
    
        }
    
        /**
         * 页面接在完成后执行的方法
         */
        @Override
        public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
    
        }
    }
    
  2. 前端操作

    1. 给免登录复选框一个标识

      https://raw.githubusercontent.com/iiimaster/PicGO/master/img/image-20210926132128058.png

    2. 复选框添加点击事件

      //10天免登录操作
      // 给复选框添加点击事件
      $("#loginFlag").click(function () {
         // 获取复选框状态
         var flag = $("#loginFlag").prop("checked")
      
         if (flag){//选中标记,并自定义标识值
            $("#flag").val("select")
         }else{//未选中
            $("#flag").val("")
         }
         // alert($("#flag").val())
      })
      
    3. 点击登录时获取标识信息

      // 10天免登录标记
      var flag = $("#flag").val()
      // 使用ajax进行数据传递
      
      
  3. 后端操作

    1. 执行登录操作时,login.do

      // 首先接收flag的值
      
      // 其次只有在用户验证通过后才能进行此操作,否则写入cookie中的信息有可能是错误
      if ("select".equals(flag)){
      
          // 将用户名和密码存放到cookie中
          Cookie loginActCookie = new Cookie("loginAct", loginAct);
          // 密码要存入加密后的密码
          Cookie loginPwdCookie = new Cookie("loginPwd", md5Pwd);
          // cookie的相关参数
          int editTime = 60*60*24*10;// 10天
          // 设置cookie的过期时间
          loginActCookie.setMaxAge(editTime);
          loginActCookie.setPath("/");
          loginPwdCookie.setMaxAge(editTime);
          loginPwdCookie.setPath("/");
      
          // 将cookie对象写回浏览器
          response.addCookie(loginActCookie);
          response.addCookie(loginPwdCookie);
      
      }
      
    2. 跳转登录页面时,toLogin.do

      // 获取cookie
      Cookie[] cookies = request.getCookies();
      // 将cookie中的值与用户名和密码进行对比
      String loginAct=null;
      String loginPwd=null;
      for (Cookie cookie : cookies) {
          if ("loginAct".equals(cookie.getName())){
              // 获取到用户名称
              loginAct = cookie.getValue();
              // 结束本次循环
              continue;
          }
          if ("loginPwd".equals(cookie.getName())){
              loginPwd = cookie.getValue();
          }
      }
      
      // 自动登录操作
      if (loginAct != null && loginPwd != null) {// 获取到了用户名和密码
      
          // 获取用户ip
          String ip = request.getRemoteAddr();
      
          // 执行自动登录
          User autoLoginUser = userService.login(loginAct, loginPwd, ip);
      
          if (autoLoginUser != null){// 登录成功
              // 将user存储到session中
              request.getSession().setAttribute("user", autoLoginUser);
              // 如果登录成功,直接跳转到首页
              return "redirect:/workbench/toIndex.do";
          }
      }
      

点击全文阅读


本文链接:http://zhangshiyu.com/post/33647.html

登录  操作  密码  
<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1