zoukankan      html  css  js  c++  java
  • 10.1--登录认证拦截器

    10.1     需求

    1、用户请求url

    2、拦截器进行拦截校验

             如果请求的url是公开地址(无需登陆即可访问的url),让放行

             如果用户session 不存在跳转到登陆页面

             如果用户session存在放行,继续操作。

    10.2    登陆controller方法

    @Controller
    public class LoginController {
    
        // 登陆
        @RequestMapping("/login")
        public String login(HttpSession session, String username, String password)
                throws Exception {
    
            // 调用service进行用户身份验证
            // ...
    
            // 在session中保存用户身份信息
            session.setAttribute("username", username);
            // 重定向到商品列表页面
            return "redirect:/items/queryItems.action";
        }
    
        // 退出
        @RequestMapping("/logout")
        public String logout(HttpSession session) throws Exception {
    
            // 清除session
            session.invalidate();
    
            // 重定向到商品列表页面
            return "redirect:/items/queryItems.action";
        }
    
    }
        //登陆提交
        //userid:用户账号,pwd:密码
        @RequestMapping("/login")
        public String loginsubmit(HttpSession session,String userid,String pwd)throws Exception{
            //调用service进行用户身份认证
            //……
            //向session记录用户身份信息
            session.setAttribute("activeUser", userid);
            
            return "redirect:item/queryItem.action";
        }
        
        //退出
        @RequestMapping("/logout")
        public String logout(HttpSession session)throws Exception{
            
            //session过期
            session.invalidate();
            
            return "redirect:item/queryItem.action";
        }

    10.3     登陆认证拦截实现

    public class LoginInterceptor implements HandlerInterceptor {
    
        
        //进入 Handler方法之前执行
        //用于身份认证、身份授权
        //比如身份认证,如果认证通过表示当前用户没有登陆,需要此方法拦截不再向下执行
        @Override
        public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
            
            //获取请求的url
            String url = request.getRequestURI();
            //判断url是否是公开 地址(实际使用时将公开 地址配置配置文件中)
            //这里公开地址是登陆提交的地址
            if(url.indexOf("login.action")>=0){
                //如果进行登陆提交,放行
                return true;
            }
            
            //判断session
            HttpSession session  = request.getSession();
            //从session中取出用户身份信息
            String username = (String) session.getAttribute("username");
            
            if(username != null){
                //身份存在,放行
                return true;
            }
            
            //执行这里表示用户身份需要认证,跳转登陆页面
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
            
            //return false表示拦截,不向下执行
            //return true表示放行
            return false;
        }
    public class LoginInterceptor implements HandlerInterceptor{
    
        @Override
        Public boolean preHandle(HttpServletRequest request,
                HttpServletResponse response, Object handler) throws Exception {
    
            //如果是登录页面则放行
            if(request.getRequestURI().indexOf("login.action")>=0){
                return true;
            }
            HttpSession session = request.getSession();
            //如果用户已登录也放行
            if(session.getAttribute("user")!=null){
                return true;
            }
            //用户没有登录挑战到登录页面
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
            
            return false;
        }
    }

    10.4       拦截器配置 springmvc.xml

    <!--拦截器 -->
        <mvc:interceptors>
            <!--多个拦截器,顺序执行 -->
            <!-- 登陆认证拦截器 -->
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="cn.itcast.ssm.interceptor.LoginInterceptor"></bean>
            </mvc:interceptor>
            <mvc:interceptor>
                <!-- /**表示所有url包括子url路径 -->
                <mvc:mapping path="/**"/>
                <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
            </mvc:interceptor>
            <mvc:interceptor>
                <mvc:mapping path="/**"/>
                <bean class="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
            </mvc:interceptor>
        </mvc:interceptors>

    10.5      itemsList.jsp

    当前用户:${username },
    <c:if test="${username!=null }">
     <a href="${pageContext.request.contextPath }/logout.action">退出</a>
    </c:if>

    10.6      login.jsp

    <form action="${pageContext.request.contextPath }/login.action" method="post">
    用户账号:<input type="text" name="username" /><br/>
    用户密码 :<input type="password" name="password" /><br/>
    <input type="submit" value="登陆"/>
    在平凡中坚持前行,总有一天,会遇见优秀的自己
  • 相关阅读:
    redis的数据类型 (一) 字符串
    php 与redis 结合 使用predis
    jquery.datetimepicker.js 当鼠标离开时,不选中当前时间,以达到清空的目的
    nginx 配置 查阅资料
    座机号码的正则表达式
    mysql 局域网同事之间直接用客户端访问
    《CSS揭秘》之毛玻璃效果知识点
    《JavaScript 设计模式与开发实战》第一部分(1、2、3章)笔记
    《JavaScript_DOM编程艺术第二版(中文)》整书笔记
    Node调用C++(dll)
  • 原文地址:https://www.cnblogs.com/mao-19/p/5704196.html
Copyright © 2011-2022 走看看