SSM

SpringMVC 拦截器

2018-11-29  本文已影响0人  落云和枫

一 自定义拦截器

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

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

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

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

    3. SpringMVC 拦截器 和 Filter的区别

        3.1 拦截器只能拦截Controller

        3.2 Filter可以拦截任何请求

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

        4.1 新建类实现 HandlerInterceptor 接口

package com.chen.interceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

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("preHandle");

        return true;

    }

    //控制器执行完成,进入jsp之前执行.

    //日志记录

    //敏感词语过滤

    @Override

    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)

    throws Exception {

        System.out.println("往"+arg3.getViewName()+"跳转");

        System.out.println("model的值"+arg3.getModel().get("model"));

        String word = arg3.getModel().get("model").toString();

        String newWord = word.replace("祖国", "**");

        arg3.getModel().put("model",newWord);

        System.out.println("postHandle");

    }

    //jsp执行完成后执行

    //记录执行过程中出现的异常

    //可以把异常几率到日志中

    @Override

    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)

    throws Exception {

    System.out.println("agr3:"+arg3);

    System.out.println("afterCompletion"+arg3.getMessage());

    }

}

        4.2 在 SpringMVC.xml配置拦截器需要拦截哪些控制器

        4.2.1 拦截所有控制器

 <!-- 拦截器 -->

<mvc:interceptors>

    <mvc:interceptor>

        <bean class="com.chen.controller.DemoController"></bean>

    </mvc:interceptor>

</mvc:interceptors>

        4.2.2 拦截特定的 url

    <!-- 拦截器 -->

    <mvc:interceptors>

        <mvc:interceptor>

            <mvc:mapping path="/demo"/>

            <mvc:mapping path="/demo1"/>

            <mvc:mapping path="/demo2"/>

            <bean class="com.chen.controller.DemoController"></bean>

    </mvc:interceptor>

    </mvc:interceptors>


二 拦截器栈

   1. 多个拦截器同时生效时,组成拦截器栈

    2.顺序 先进后厨

    3 执行顺序和在springmvc.xml 中配置顺序有关

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

三 使用springmvc 拦截器实现登陆验证

    1 把页面放到 web-inf中

    2 放入到web-inf中后必须通过控制器转发到页面,springMVC 拦截器拦截的是控制器,不拦截jsp

    2. 通过拦截器栈拦截全部控制器,需要在拦截器内部方形login控制器

controller

public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object arg2) throws Exception {

    String uri = req.getRequestURI();

    if(uri.equals("/springmvc03/login")){

        return true;

    }else{

    Object obj = req.getSession().getAttribute("users");

    if(obj!=null){

        eturn true;

    }

    res.sendRedirect("/springmvc03/login.jsp");

        return false;

    }

}

        

<!-- 配置拦截器 -->

<mvc:interceptors>

<bean class="com.chen.interceptor.LoginInterceptor"></bean>

</mvc:interceptors>

上一篇下一篇

猜你喜欢

热点阅读