• 9.springMVC中的拦截器


    springMVC中的拦截器大概大致可以分为以下几个步骤去学习:

      1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用

      2.在springMVC的配置文件中添加拦截器的配置

      3.了解多个拦截器的执行过程

      4.写一个拦截器的demo

      1.先来看第一步:自定义一个类实现HandlerInterceptor接口,其中接口中的几个方法和注解我直接贴代码 

    public class HandlerInterceptor1 implements HandlerInterceptor{
        @Override
        //执行Handler完成执行该方法
        //统一的异常处理,统一的日志处理
        public void afterCompletion(HttpServletRequest arg0,
                HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {
            System.out.println("HandlerInterceptor1.......afterCompletion");
        }
        @Override
        //进入Handler之后,返回ModelAndView之前
        //从ModelAndView出发:将一些公共的模型数据传到视图,也可以在这里统一制定视图
        //菜单的导航
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2, ModelAndView arg3) throws Exception {
            System.out.println("HandlerInterceptor1.......postHandle");    
        }
        @Override
        //进入Handler之前执行
        //用于身份认证和身份授权
        //比如身份认证,如果身份认证没有通过表示该用户没有登录,需要次方法不再向下执行
        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2) throws Exception {
            System.out.println("HandlerInterceptor1.......preHandle");
            return false;
        }
    }

      2.第二步在springMVC的配置文件中添加拦截器的配置其中<bean class="com.etc.interceptor.Interceptor1"></bean>是你自定义拦截器的路径(包名+类名)

      拦截器可以配置多个,以下我只是简单配置了两个拦截器

    <!-- 拦截器的配置 -->
        <mvc:interceptors>
        <!-- 如果有配置多个拦截器,按照顺序执行 -->
            <mvc:interceptor>
            <!-- 拦截的路径:/**表示所有的url包括子url -->
                <mvc:mapping path="/**"/>
                <bean class="com.etc.interceptor.Interceptor1"></bean>
            </mvc:interceptor>
            <mvc:interceptor>
            <!-- 拦截的路径:/**表示所有的url包括子url -->
                <mvc:mapping path="/**"/>
                <bean class="com.etc.interceptor.Interceptor2"></bean>
            </mvc:interceptor>
        </mvc:interceptors>

      3.了解拦截器的执行过程

      测试1两个拦截器同时放行(把两个preHandle方法的放回值设置成true

      运行结果:

       

      分析结果:

        都放行的情况下:preHandle顺序执行,postHandle,afterCompletion是逆序执行

      测试2:第一个放行,第二个不放行(第一个拦截器的preHandle的返回值设置成true,第二个false

      运行结果

       

      分析结果:

        拦截器1放行,2不放行:只有拦截器1preHandle放行,2preHandle才会执行

         拦截器2不放行:拦截器2postHandle,afterCompletion方法就都不执行

         就是只要有一个拦截器不放行:postHandle方法就都不执行

      测试3:拦截器1,2都不放行(第一个和第二个拦截器的preHandle的返回值都设置成false)

      运行结果:

       

      分析结果:

        就是拦截器1不放行:那么2他是根本不执行

      

      4.写一个拦截器的demo(以登录拦截为例子):当你发起一个请求的时候,会被拦截器拦截,判断你是否登录,如果你登录,就继续执行,如果没有登录,就跳转到登录的页面让你先登录。

      看看步骤是怎么样的:

        1.用户发起请求l

        2.拦截器进行拦截(对url进行拦截)

          进行判断如果用户的session存在,放行

          如果用户session不存在,然他跳转到登录的页面

        3.有一些地址是不能拦截(公开地址),就是不需要登录也能访问的url,如果是这个地址也要放行。(对于这些公开地址我们应该在配置文件中体现)

        如果对公开地址还是不了解的话:你可以想一下,如果你对登录也拦截是不是这辈子都别想登录成功(登录就是一个公开地址)

      来看看代码吧:

        1.首先你需要在自定义的拦截器类中定义一个集合存放公开地址,因为公开地址可能不止一个(get,set方法记得生成) 

    private List<String> unCheckUrl; 

     

        2.你要在拦截器的配置文件中把公开地址配置进去(有多个的话,在list中补充value就好) 

        <!-- 拦截器的全局配置 -->
        <mvc:interceptors>
            <!-- 多个拦截器顺序执行 -->
            <mvc:interceptor>
                <!-- /**:表示拦截所有的url包括子url /*只拦截根url -->
                <mvc:mapping path="/**" />
                <bean class="com.etc.interceptor.LoginInterceptor">
                    <property name="unCheckUrl">
                        <list>
                            <value>/springmvc_demo/login</value>
                        </list>
                    </property>
                </bean>
            </mvc:interceptor>
        </mvc:interceptors

        3.在preHandle方法中编写你的处理逻辑

    //进入Handler之前执行
        //用于身份认证和身份授权
        //比如身份认证,如果身份认证没有通过表示该用户没有登录,需要次方法不再向下执行
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                Object arg2) throws Exception {
            //获取请求的url
            String url = request.getRequestURI();
            //公开的通过就是对公开地址不进行拦截
          
         for(String uri:unCheckUrl){  
          if(url.contains(uri)){
                  return true;
              }
        }
            //从session中取出用户的身份进行验证
            HttpSession session =request.getSession();
            String username=(String) session.getAttribute("username");//如果在session中有取到用户名,说明已经登录,也方向
            if(username!=null){
            //已经登录,放行
                return true;
            }
            request.getRequestDispatcher("/WEB-INF/view/login.jsp").forward(request, response);//没有取到的话,就跳转到登录页面
            return false;
        }
  • 相关阅读:
    NOJ-1581 筷子 (线性DP)
    UVA-242 Stamps and Envelope Size (DP)
    POJ 1860 (SPFA判断正环)
    POJ 3268 最短路水题
    STL----priority_queue
    STL----unique
    POJ 2031(最小生成树Kruskal算法+几何判断)
    POJ 3468(线段树区间修改+区间求和)
    学习线段树
    POJ 1251(最小生成树裸题)
  • 原文地址:https://www.cnblogs.com/huaixiaoz/p/5784536.html
Copyright © 2020-2023  润新知