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控制器

  • 相关阅读:
    理解Linq和lambda
    (转)Fidder教程
    (转)Fiddler Composer创建和发送HTTP Request
    (转)http协议详解
    C# sealed & internal
    javascript中的封装,多态,继承
    Fiddler Script 用法
    强烈推荐:240多个jQuery插件
    用C#编写ActiveX控件(1)
    用C#编写ActiveX控件(二)
  • 原文地址:https://www.cnblogs.com/axu521/p/10173179.html
Copyright © 2011-2022 走看看