zoukankan      html  css  js  c++  java
  • SpringMVC由浅入深day02_10拦截器

    10 拦截器

    Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

      10.1 拦截定义

    定义拦截器,实现HandlerInterceptor接口。接口中提供三个方法。

    package cn.itcast.ssm.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    public class HandlerInterceptor1 implements HandlerInterceptor{
        
        //进入Handler方法之前执行
        //用于身份认证,身份授权
        //比如身份认证,认证不通过表示便是当前用户没有登录,需要此方法拦截不再向下执行
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                Object handler) throws Exception {
            //return false表示拦截不向下执行
            //return true表示放行
            return false;
        }
        
        //进入Handler方法之后,返回modelAndView之前执行
        //应用场景从modelAndView出发,将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response,
                Object handler, ModelAndView modelAndView) throws Exception {
            
        }
        
        //执行handler完成执行此方法
        //应用场景:统一异常处理,统一日志处理
        @Override
        public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object handler, Exception ex) throws Exception {
        }
    }

      10.2 拦截器配置

        10.2.1 针对HandlerMapping配置

    springmvc拦截器针对HandlerMapping进行拦截设置,如果在某个HandlerMapping中配置拦截,经过该 HandlerMapping映射成功的handler最终使用该拦截器。

    <bean
        class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
        <property name="interceptors">
            <list>
                <ref bean="handlerInterceptor1"/>
                <ref bean="handlerInterceptor2"/>
            </list>
        </property>
    </bean>
        <bean id="handlerInterceptor1" class="springmvc.intercapter.HandlerInterceptor1"/>
        <bean id="handlerInterceptor2" class="springmvc.intercapter.HandlerInterceptor2"/>

    一般不推荐使用。

        10.2.2 类似全局的拦截器

    springmvc.xml中配置类似全局的拦截器,springmvc框架将配置的类似全局的拦截器注入到每个HandlerMapping中。

      10.3 拦截测试

        10.3.1 测试需求

    测试多个拦截器各方法执行时机。

        10.3.2 编写两个拦截

        10.3.3 两个拦截器都放行

    HandlerInterceptor1...preHandle

    HandlerInterceptor2...preHandle

    HandlerInterceptor2...postHandle

    HandlerInterceptor1...postHandle

    HandlerInterceptor2...afterCompletion

    HandlerInterceptor1...afterCompletion

    总结:

    preHandle方法按顺序执行,

    postHandleafterCompletion按拦截器配置的逆向顺序执行。

        10.3.4 拦截器1放行,拦截器2不放行

    HandlerInterceptor1...preHandle

    HandlerInterceptor2...preHandle

    HandlerInterceptor1...afterCompletion

    总结:

    拦截器1放行,拦截器2 preHandle才会执行。

    拦截器2 preHandle不放行,拦截器2 postHandleafterCompletion不会执行。

    只要有一个拦截器不放行,postHandle不会执行。

        10.3.5 拦截器1不放行,拦截器2不放行

    HandlerInterceptor1...preHandle

    拦截器1 preHandle不放行,postHandleafterCompletion不会执行。

    拦截器1 preHandle不放行,拦截器2不执行。

        10.3.6 小结

    根据测试结果,对拦截器应用。

    比如:统一日志处理拦截器,需要该拦截器preHandle一定要放行,且将它放在拦截器链接中第一个位置。

    比如:登陆认证拦截器,放在拦截器链接中第一个位置。权限校验拦截器,放在登陆认证拦截器之后。(因为登陆通过后才校验权限)

      10.4 拦截器应用(实现登陆认证)

        10.4.1 需求

    1、用户请求url

    2、拦截器进行拦截校验

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

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

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

        10.4.2 登陆controller方法

    LoginController.java

    @Controller
    public class LoginController {
        //登录
        @RequestMapping("/login")
        public String login(HttpSession session, String username, String password) {
            // 调用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";
        }
    }

        10.4.3 页面

    login.jsp

    itemsList.jsp中添加

        10.4.4 登陆认证拦截实现

          10.4.4.1 代码实现

    LoginInterceptor.java

    package cn.itcast.ssm.interceptor;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    /**
     * 登录认证拦截器
     * @author yejin
     */
    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();
            String username = (String) session.getAttribute("username");
            if(username != null) {
                //身份存在,放行
                return true;
            }
            
            //执行这里表示用户身份需要认证,跳转到登录页面
            request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
            return false;
        }
        
        //进入Handler方法之后,返回modelAndView之前执行
        //应用场景从modelAndView出发,将公用的模型数据(比如菜单导航)在这里传到视图,也可以在这里统一指定视图
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response,
                Object handler, ModelAndView modelAndView) throws Exception {
            System.out.println("loginInterceptor.postHandle()");
        }
        
        //执行handler完成执行此方法
        //应用场景:统一异常处理,统一日志处理
        @Override
        public void afterCompletion(HttpServletRequest request,
                HttpServletResponse response, Object handler, Exception ex) throws Exception {
            System.out.println("loginInterceptor.afterCompletion()");
        }
    }

          10.4.4.2 拦截器配置

    在springmvc.xml中配置

    启动服务器访问:http://localhost:8080/springmvc_mybatis1217/items/queryItems.action

  • 相关阅读:
    《java入门第一季》之面向对象(static关键字)
    《java入门第一季》之面向对象(面向对象案例详解)
    《java入门第一季》之面向对象面试题(面向对象都做了哪些事情)
    《java入门第一季》之面向对象(成员方法)
    《android入门第一季》之android目录结构详解
    Vue 中的 Props 与 Data 细微差别,你知道吗?
    使用Vue 3.0做JSX(TSX)风格的组件开发
    vue中Axios的封装和API接口的管理
    在 Vue.js 中制作自定义选择组件
    webpack打包原理
  • 原文地址:https://www.cnblogs.com/justdoitba/p/8343400.html
Copyright © 2011-2022 走看看