zoukankan      html  css  js  c++  java
  • 框架理论深入(六)--拦截器

    一、概念

      1、拦截器拦截的是controller,类似于AOP;

      2、拦截器只会拦截.action,不会去拦截jsp文件,过滤器才会去拦截jsp文件(过滤器拦截的是所有的URL);

    二、拦截器的实现

      1、创建一个拦截器,实现HandlerInterceptor接口,并且声明它为一个bean;

    @Component
    public class MyInterceptor implements HandlerInterceptor {
        @Override
        public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
                throws Exception {
            // 执行Hander完成后执行:统一异常处理,日志操作
            System.out.println("afterCompletion:执行Hander完成后执行:统一异常处理,日志操作");
        }
        @Override
        public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
                throws Exception {
            // 进入Hander方法之后,返回ModelAndView之前执行:将公用模型数据传递到视图
            System.out.println("postHandle:进入Hander方法之后,返回ModelAndView之前执行:将公用模型数据传递到视图");
        }
        @Override
        public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
            // 进入Hander方法之前执行,用于权限身份验证
            System.out.println("preHandle:进入Hander方法之前执行,用于权限身份验证");return true;
        }
    }

      2、在SpringMVC配置文件中配置拦截器,给出拦截器类的bean;

    <mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <ref bean="myInterceptor"/>
        </mvc:interceptor>
    </mvc:interceptors>

      3、测试

      

    三、案例,登录拦截器

      1、首先,进行登录权限验证我们需要使用到的拦截器的方法为:preHandle();

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        // 进入Hander方法之前执行,用于权限身份验证
        System.out.println("preHandle:进入Hander方法之前执行,用于权限身份验证");
        return true;
    }

      2、编写登录页面

    <body>
        <form action="login.action" method="post">
            用户名:<input type="text" name="name" /><br>
            密码:<input type="text" name="password" /><br>
            <input type="submit" />
        </form>
    </body>

      3、书写登录的controller方法

    @Controller
    public class LoginController {
        @RequestMapping("/login.action")
        public String login(User user,HttpSession session,Model model) {
            if("admin".equals(user.getName()) && "admin".equals(user.getPassword())) {
                System.out.println("登录成功");
                session.setAttribute("login", "suc");
                model.addAttribute("result","suc");
            }else {
                model.addAttribute("result","error");
            }
            return "result";
        }
    }

      4、在拦截器中书写方法

    @Override
    public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception {
        // 进入Hander方法之前执行,用于权限身份验证
        System.out.println("preHandle:进入Hander方法之前执行,用于权限身份验证");
            
        //判断是否进入的是login.action所对应的方法;如果是,则进入对应的方法;如果不是,则返回登录页;(只能拦截action)
        String url = arg0.getRequestURI();
        if(url.indexOf("login.action")>=0) {
            return true;
        }
            
        //如果不是进入的login.action方法,则判断是否已经登录成功;
        HttpSession session=arg0.getSession();
        String login=(String) session.getAttribute("login");
        if(login!=null && login.equals("suc")) {
            return true;
        }
            
        arg0.getRequestDispatcher("login.jsp").forward(arg0, arg1);
        return false;
    }

       (1)、第一个if判断;判断的是是否进入的是登录的controller方法,也就是判断是否是通过登录页进入;

       (2)、第二个if判断;判断的是用户是否已经成功登录;

      注:因为拦截器也是SpringMVC中的一个bean,所以也可以在拦截器类中注入dao,直接从数据库中读取数据,方便完成拦截的功能;

    PS:因作者能力有限,如有误还请谅解;

  • 相关阅读:
    [转贴]Asp.Net[C#]在线压缩解压
    [转载]如何用C#语言构造蜘蛛程序
    [转载].net 集合类初步认识
    试用随笔
    安装中文VS2008 SP1 和.NETFRAMEWORK 3.5SP1后智能提示是英文的解决办法
    关于IE提示“Internet Explorer无法打开站点,已终止操作”的解决办法
    linux每天建立一个以当天日期命名的文件夹
    linux常用装机命令
    linux安装oracle客户端
    批量分发文件
  • 原文地址:https://www.cnblogs.com/WHL5/p/9109939.html
Copyright © 2011-2022 走看看