欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kite的学习历程之SpringMVC拦截器

程序员文章站 2022-06-06 14:42:21
...

Kite学习框架的第十四天

1. SpringMVC拦截器

简介:Spring MVC 的处理器拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 用户可以自己定义一些拦截器来实现特定的功能。 谈到拦截器,还要向大家提一个词——拦截器链(Interceptor Chain)。拦截器链就是将拦截器按一定的顺 序联结成一条链。在访问被拦截的方法或字段时,拦截器链中的拦截器就会按其之前定义的顺序被调用。

域servlet中的过滤器进行比较
过滤器 是 servlet 规范中的一部分,任何 java web 工程都可以使用。
拦截器 是 SpringMVC 框架自己的,只有使用了 SpringMVC 框架的工程才能用。
过滤器 在 url-pattern 中配置了/*之后,可以对所有要访问的资源拦截。
拦截器 它是只会拦截访问的控制器方法,如果访问的是 jsp,html,css,image 或者 js 是不会进行拦 截的。
它也是 AOP 思想的具体应用。
我们要想自定义拦截器, 要求必须实现:HandlerInterceptor 接口。

1.1 自定义拦截器步骤

1.1.1 创建一个controller类


package cn.kitey.controller;


import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 被拦截的controller方法
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/testInterceptor")
    public String testException()  {
        System.out.println("testInterceptor执行了!");


        return  "success";
    }


}

1.1.2 创建一个index.jsp页面,用于controller的进入,一个success.jsp页面用于跳转成功页面,一个error.jsp页面,用于拦截器中的页面跳转

index.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: 小风筝
  Date: 2020/6/19
  Time: 22:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>SpringMVC拦截器</title>

    <h3>SpringMVC拦截器</h3>
    <a href="user/testInterceptor">异常处理</a>
</head>
<body>

</body>
</html>


注意在pages包下,因为我们设置的视图解析器为该路径下的.jsp文件
success.jsp页面


<%--
  Created by IntelliJ IDEA.
  User: 小风筝
  Date: 2020/6/19
  Time: 22:18
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>success</title>
</head>
<body>
    转发成功!

    <% System.out.println("success.jsp页面执行了"); %>
</body>
</html>

error.jsp页面

<%--
  Created by IntelliJ IDEA.
  User: 小风筝
  Date: 2020/6/20
  Time: 10:50
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>error</title>
</head>
<body>

<h3>ERROR页面</h3>
</body>
</html>


1.1.3 创建一个interceptor包,在其中创建MyInterceptor类,实现接口HandlerInterceptor

其中重写的方法有:
public boolean preHandle(): 预处理方法,在执行控制器前进行执行,含有返回值,返回为false表示不放行,但是可以在该方法中执行,请求转发,跳转到error页面request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);
public void postHandle(): 后处理方法,在执行controller后,在success.jsp之前进行执行。没有返回值,可以执行请求转发方法,但是会执行success.jsp页面
public void afterCompletion(): 最后处理方法,在success.jsp页面执行后,执行该方法,不能进行请求转发方法。

package cn.kitey.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 自定义拦截器类
 */
public class MyInterceptor implements HandlerInterceptor {

    /**
     * 预处理,controller方法执行之前
     * return true :表示放行,执行下一个拦截器,执行controller中的方法
     * return false 不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor拦截器执行了。。。。。预处理!");

        //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);

        //这里设置不进行放行,或者放行
        return true;

    }

    /**
     * 后处理方法,经过controller后返回时,执行的方法,在success.jsp方法前执行
     * @param request
     * @param response
     * @param handler
     * @param
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor拦截器执行了。。。。。后处理!");
        //这里也可以通过请求转发跳转页面(但是后面的success.jsp页面也会进行执行)
        //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);

    }

    /**
     * 最后处理,在success.jsp执行后,在执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor拦截器执行了。。。。。最后处理!");
        //该方法不能进行页面的请求转发!!
    }
}


1.1.4 在创建一个拦截器进行拦截

package cn.kitey.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


/**
 * 自定义拦截器类
 */
public class MyInterceptor1 implements HandlerInterceptor {

    /**
     * 预处理,controller方法执行之前
     * return true :表示放行,执行下一个拦截器,执行controller中的方法
     * return false 不放行
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("MyInterceptor拦截器执行了。。。。。预处理111!");

        //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);

        //这里设置不进行放行,或者放行
        return true;

    }

    /**
     * 后处理方法,经过controller后返回时,执行的方法,在success.jsp方法前执行
     * @param request
     * @param response
     * @param handler
     * @param
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("MyInterceptor拦截器执行了。。。。。后处理111!");
        //这里也可以通过请求转发跳转页面(但是后面的success.jsp页面也会进行执行)
        //request.getRequestDispatcher("/WEB-INF/pages/error.jsp").forward(request,response);

    }

    /**
     * 最后处理,在success.jsp执行后,在执行该方法
     * @param request
     * @param response
     * @param handler
     * @param ex
     * @throws Exception
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("MyInterceptor拦截器执行了。。。。。最后处理111!");
        //该方法不能进行页面的请求转发!!
    }
}


1.1.5 在springMVC中配置拦截器

配置标签为interceptors
其中我们配置类两自定义拦截器
MyInterceptor :拦截路径为/uesr/
.MyInterceptor1:拦截路径:/**

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:nvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">

    <!--开启对包路径的扫描-->
    <context:component-scan base-package="cn.kitey"></context:component-scan>

    <!--开启视图解析器 -->
    <bean id="internalResourceViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <!--注入文件所在的路径-->
        <property name="prefix" value="/WEB-INF/pages/"></property>
        <!--配置扫描的文件后缀名-->
        <property name="suffix" value=".jsp"></property>
    </bean>

    <!--配置拦截器-->
    <nvc:interceptors>
        <mvc:interceptor>
            <!--配置要进行拦截的路径-->
            <mvc:mapping path="/user/*"/>
            <bean class="cn.kitey.interceptor.MyInterceptor"></bean>
        </mvc:interceptor>
        
        <!--添加拦截器路径-->
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="cn.kitey.interceptor.MyInterceptor1"></bean>
        </mvc:interceptor>
        
    </nvc:interceptors>



    <!--开启SpringMVC框架注解的支持-->
    <mvc:annotation-driven ></mvc:annotation-driven>



</beans>

运行结果图
index.jsp页面
Kite的学习历程之SpringMVC拦截器

控制台显示
Kite的学习历程之SpringMVC拦截器
跳转页面
Kite的学习历程之SpringMVC拦截器
当设置不放行的话,就不会条状到该页面,则会跳转到error.jsp页面

相关标签: 每天的学习笔记