zoukankan      html  css  js  c++  java
  • 自定义拦截器

     一、

    1、跟过滤器比较像的技术

    2、发送请求时被拦截器拦截,在控制器的前后添加额外的功能

      2.1、跟AOP区分开,AOP在特定方法前后扩充(对ServiceImpl)

      2.1、拦截器,请求的拦截,针对点是控制器方法(对Controller)

    3、SpringMVC 拦截器和Filter的区别

      3.1 拦截器只能拦截Controller

      3.2 Filter 可以拦截任何请求

     4、实现自定义拦截器的步骤:

      4.1 新建类实现 HandlerInterceptor

    public class DemoInterceptor implements HandlerInterceptor{
        //在进行控制器之前执行
        //如果返回值是false,阻止进入控制器
        @Override
        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2) throws Exception {
            System.out.println("arg2"+arg2);
            System.out.println("preHandle111");
            return true;
        }
        //控制器执行完成,在进入jsp页面之前执行
        //日志记录
        //敏感词汇过滤
        @Override
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2, ModelAndView arg3) throws Exception {
            System.out.println("postHandle222");
            System.out.println("往"+arg3.getViewName()+"跳转");
            String word = arg3.getModel().get("model").toString();
            String newWord=word.replace("傻逼","好孩子");
            arg3.getModel().put("model",newWord);
            }
        //jsp执行完成后执行
        //记录执行过程中异常(日志收集)
        //不管出不出现异常都执行这个方法
        @Override
        public void afterCompletion(HttpServletRequest arg0,
                HttpServletResponse arg1, Object arg2, Exception arg3) 如果没有异常 arg3为 Null
    throws Exception {
            System.out.println(arg3.getMessage());
            System.out.println("afterCompletion3333");
        }
    }

      4.2 在springmvc.xml 中配置拦截器,需要拦截哪些控制器 

        4.2.1 指定 Controller 进行拦截

            <!-- 拦截器配置 -->
            <mvc:interceptors>
                <mvc:interceptor>
                    <mvc:mapping path="/demo"/>  / 项目根目录
                    <mvc:mapping path="/demo2"/>
                    <bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
                </mvc:interceptor>
            </mvc:interceptors>
            

         4.2.2 对全部的 Controller 进行拦截

            <!-- 拦截器配置 -->
            <mvc:interceptors>
                    <bean class="com.bjsxt.interceptor.DemoInterceptor"></bean>
            </mvc:interceptors>

    二、拦截器栈

      1、多个拦截器同时生效时,则成了拦截器栈

       2、顺序:先进后出

       3、执行顺序和在springmvc.xml 中配置顺序有关  栈(先进后出)

            <!-- 拦截器配置 -->
            <mvc:interceptors>
                    <bean class="com.bjsxt.interceptor.DemoInterceptor"></bean> 
                    <bean class="com.bjsxt.interceptor.DemoInterceptor2"></bean>
            </mvc:interceptors>

       4、设置先配置拦截器A 再配置拦截器B 执行顺序为

        preHandle(A) --> preHandle(B) --> 控制器方法 ----> postHandle(B) ---> postHandle(A)

        ----> JSP ----> afterCompletion(B) ---> afterCompletion(A) 

    实例:必须通过登录页面才能进入mian.jsp和main2.jsp

      1、jsp页面

         1.1  Login.jsp页面

     

      2、新建控制器类

    @Controller
    public class DemoController {
        @RequestMapping("{page}")
        public String page(@PathVariable String page){
            System.out.println("restful");
            return page;
        }
        
        @RequestMapping("login")
        public String login(Users user,HttpSession session){
            if(user.getUsername().equals("admin")&&user.getPassword().equals("123")){
                session.setAttribute("user", user);
                return "main";
            }else{
                return "redirect:/login.jsp";
            }
        }
    }

      3、在springmvc.xml 中配置 拦截器

            <!-- 自定义拦截器 -->
            <mvc:interceptors>
                <bean  class="com.bjsxt.interceptor.LoginInterceptor"></bean>
            </mvc:interceptors>

      4、新建拦截器类

    public class LoginInterceptor implements HandlerInterceptor{
    
        @Override
        public void afterCompletion(HttpServletRequest arg0,
                HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {
        }
    
        @Override
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2, ModelAndView arg3) throws Exception {
        }
    
        @Override
        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
                Object arg2) throws Exception {
            String uri = arg0.getRequestURI();
            if(uri.equals("/springmvc8/login")){
                return true;
            }else{
                Object user = arg0.getSession().getAttribute("user");
                if(user!=null){
                    return true;
                }else{
                    arg1.sendRedirect("/springmvc8/login.jsp");
                    return false;
                }            
            }
        }
    }

    使用SpringMVC拦截器实现登录验证

      1、把页面放入到web-inf中

        1.1 放入到wen-inf 中后必须通过控制器转发到页面

        1.2 springmvc拦截器拦截的是控制器,不能拦截jsp

      2、通过拦截器拦截全部控制器,需要在拦截器内容放行 login控制器

  • 相关阅读:
    克如斯卡尔 P1546
    真正的spfa
    第四课 最小生成树 要点
    关于vscode中nullptr未定义
    cmake学习笔记
    python学习笔记
    (BFS 图的遍历) 2906. kotori和迷宫
    (图论基础题) leetcode 997. Find the Town Judge
    (BFS DFS 并查集) leetcode 547. Friend Circles
    (BFS DFS 图的遍历) leetcode 841. Keys and Rooms
  • 原文地址:https://www.cnblogs.com/axu521/p/10173179.html
Copyright © 2011-2022 走看看