Java SpringMVC实现自定义拦截器

在Java SpringMVC中,可以通过自定义拦截器来实现许多功能,例如登录验证、权限控制、日志记录等。通过拦截器,我们可以在请求到达Controller之前或之后对请求进行一些处理。在本文中,我们将讲解如何使用Java SpringMVC来实现自定义拦截器。

Java SpringMVC实现自定义拦截器

简介

在Java SpringMVC中,可以通过自定义拦截器来实现许多功能,例如登录验证、权限控制、日志记录等。通过拦截器,我们可以在请求到达Controller之前或之后对请求进行一些处理。在本文中,我们将讲解如何使用Java SpringMVC来实现自定义拦截器。

1. 创建拦截器

实现HandlerInterceptor接口

要创建一个自定义的拦截器,我们需要先实现SpringMVC提供的HandlerInterceptor接口。该接口包含了三个方法,分别是preHandle()、postHandle()和afterCompletion()。

preHandle()

该方法在请求到达Controller之前被调用。我们可以在该方法中检查一些条件,例如用户是否已经登录等。如果该方法返回true,则请求会继续向Controller进行处理;如果返回false,则请求不会继续进行,直接返回给客户端。

postHandle()

该方法在Controller的处理完成后,但在视图返回之前被调用。我们可以在该方法中修改返回的ModelAndView。该方法具有一个参数ModelAndView,可以在该参数中添加一些额外的数据以供视图使用。

afterCompletion()

该方法在视图返回后调用。该方法可以用于清理一些资源,例如关闭数据库连接等。

下面是一个简单的拦截器示例:

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("Pre handle method is calling");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("Post handle method is calling");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
        System.out.println("After completion handle method is calling");
    }
}

2. 配置拦截器

配置拦截器

要使用自定义拦截器,我们需要在SpringMVC的配置文件中进行配置。在配置文件中,我们需要通过mvc:interceptors标签来配置拦截器。下面是一个简单的配置示例:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**" />
        <mvc:exclude-mapping path="/login"/>
        <bean class="com.example.MyInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

在上面的例子中,我们创建了一个拦截器MyInterceptor,并将其应用于所有请求中,但是排除了/login请求。

3. 测试拦截器

我们已经创建了一个简单的拦截器并进行了配置,现在我们需要测试它是否正常工作。我们可以创建一个Controller,并在该Controller的方法中添加一些打印语句,以便我们可以在控制台中查看拦截器的请求流程。

@Controller
    public class MyController {

        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String sayHello(Model model) {
            System.out.println("Hello method is calling");
            model.addAttribute("message", "Hello, World!");
            return "hello";
        }
    }

上面的Controller包括一个简单的sayHello()方法,该方法返回一个视图名称hello,并将一些数据添加到Model中。当我们在浏览器中访问/hello请求时,控制台中输出的信息应如下所示:

Pre handle method is calling
Hello method is calling
Post handle method is calling
After completion handle method is calling

4. 示例说明

以上是一个简单的实现拦截器的示例,下面我会再举一个实际案例来说明如何应用拦截器。

案例背景:在一个电商平台中,用户下单时需要登录,为了方便用户和提高用户体验,我们可以使用拦截器进行登录验证。

代码实现:

创建一个拦截器LoginInterceptor

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        HttpSession session = request.getSession();
        Object user = session.getAttribute("user");
        if (user == null) {
            response.sendRedirect("login");
            return false;
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // do nothing
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // do nothing
    }
}

在上面的拦截器中,我们通过检查Session中是否有一个名为user的属性来判断用户是否已经登录。如果用户没有登录,我们将请求重定向到登录页面,并返回false,表示请求已经结束;如果用户已经登录,则返回true,表示请求可以继续进行。

配置拦截器

在SpringMVC的配置文件中配置拦截器

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/order/**" />
        <bean class="com.example.LoginInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

在上面的配置中,我们配置了一个拦截器LoginInterceptor,并将其应用于所有/order/**路径的请求中。在这个示例中,我们假设所有需要登录的请求都以/order/开头。

创建一个Controller

@Controller
@RequestMapping("/order")
public class OrderController {

    @RequestMapping(value = "/create", method = RequestMethod.POST)
    public String createOrder(Model model) {
        // handle create order
        return "order-success";
    }

    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String listOrders(Model model) {
        // handle list orders
        return "order-list";
    }
}

在上面的Controller中,我们包含了两个请求处理方法createOrder()和listOrders()。在createOrder()方法中,我们处理创建订单的请求,并在请求处理完成后返回一个视图名称order-success;在listOrders()方法中,我们处理列出订单列表的请求,并在请求处理完成后返回一个视图名称order-list。

测试拦截器

现在我们已经准备好测试拦截器是否工作了。我们可以通过登录页面来测试,如果用户没有登录,则请求将被重定向到登录页面;如果用户已经登录,则请求将被顺利处理,返回视图。

完整代码实现:https://github.com/linlinjava/litemall/tree/master/litemall-admin/src/main/java/org/linlinjava/litemall/admin/interceptor

本文标题为:Java SpringMVC实现自定义拦截器

基础教程推荐