自定义拦截器

 一、

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

原文地址:https://www.cnblogs.com/axu521/p/10173179.html