Hướng dẫn sử dụng Spring MVC Interceptor

Xem thêm :

  • Hướng dẫn và ví dụ Spring Boot Interceptor

1- Spring Interceptor là gì?

Khi bạn tới công ty và muốn gặp sếp của công ty đó. Bạn cần phải đi qua các chốt chặn (Interceptor), các chốt chặn ở đây có thể là người bảo vệ cổng, nhân viên lễ tân,..

Trong Spring, khi một request được gửi đến controller, trước khi request được xử lý bởi Controller, nó phải vượt qua các Interceptor (0 hoặc nhiều).

Spring Interceptor là một khái niệm khá giống với Servlet Filter.

Spring Interceptor chỉ áp dụng đối với các request đang được gửi đến một Controller.

Bạn có thể sử dụng Interceptor để làm một số việc, chẳng hạn như ghi lại Log, thêm hoặc cập nhập các cấu hình trước khi request được xử lý bởi Controller, …

Một trong các ứng dụng Spring MVC có sử dụng Interceptor là “Ứng dụng web đa ngôn ngữ”. Bạn có thể xem thêm về ứng dụng này tại đây:

  • Tạo ứng dụng web đa ngôn ngữ với Spring MVC

Lớp Interceptor của bạn cần phải thực hiện interface org.springframework.web.servlet.HandlerInterceptor hoặc mở rộng từ lớp org.springframework.web.servlet.handler.HandlerInterceptorAdapter.

Bạn cần phải tiến hành 3 phương pháp trừu tượng :

  • public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  • public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView)
  • public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)

Chú ý: phương thức preHandle trả về true hoặc false. Nếu trả về true nghĩa là request sẽ tiếp tục đi tới đích của nó (Là một Controller) .

Một request có thể phải vượt qua nhiều Interceptor. Hình dưới đây minh họa điều đó.

2- Tạo Maven Project

  • File/New/Other..



  • Group Id: org.o7planning
  • Artifact Id: SpringMVCInterceptor
  • Package: org.o7planning.springmvcinterceptor


Project đã được tạo ra :

Đảm bảo bạn sử dụng Java >=6.

Project Properties:


3- Khai báo Maven và web.xml

Sử dụng Servlet API >= 3.

web.xml




   
    SpringMVCInterceptor
   

pom.xml





4.0.0
org.o7planning
SpringMVCInterceptor
war
0.0.1-SNAPSHOT
SpringMVCInterceptor Maven Webapp
http://maven.apache.org


  
      
          junit
          junit
          3.8.1
          test
      


      
      
      
          javax.servlet
          javax.servlet-api
          3.1.0
          provided
      


      
      
      
          javax.servlet
          jstl
          1.2
      


      
      
      
          javax.servlet.jsp
          jsp-api
          2.2
          provided
      



      
      
      
          org.springframework
          spring-core
          4.3.3.RELEASE
      

      
      
          org.springframework
          spring-web
          4.3.3.RELEASE
      

      
      
          org.springframework
          spring-webmvc
          4.3.3.RELEASE
      


  
 
 
  
      SpringMVCInterceptor
      

          
          
          
              org.apache.tomcat.maven
              tomcat7-maven-plugin
              2.2
            
              
            
              
          
      
  
 

4- Cấu hình Spring MVC


SpringWebAppInitializer. java


package org.o7planning.springmvcinterceptor.config;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class SpringWebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext appContext = new AnnotationConfigWebApplicationContext();
        appContext.register(ApplicationContextConfig.class);

        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("SpringDispatcher",
                new DispatcherServlet(appContext));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("/");
    }

}

ApplicationContextConfig. java


package org.o7planning.springmvcinterceptor.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.view.InternalResourceViewResolver;

@Configuration

@ComponentScan("org.o7planning.springmvcinterceptor.*")
public class ApplicationContextConfig {

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();

        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".jsp");

        return viewResolver;
    }
 
}

Các Interceptor sẽ được đăng ký với ứng dụng bởi lớp WebMvcConfig.

WebMvcConfig. java


package org.o7planning.springmvcinterceptor.config;

import org.o7planning.springmvcinterceptor.interceptor.AdminInterceptor;
import org.o7planning.springmvcinterceptor.interceptor.LogInterceptor;
import org.o7planning.springmvcinterceptor.interceptor.OldLoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
@EnableWebMvc
public class WebMvcConfig extends WebMvcConfigurerAdapter {

 
   // Cấu hình để sử dụng các file nguồn tĩnh (html, image, ..)
   @Override
   public void addResourceHandlers(ResourceHandlerRegistry registry) {

   }

   @Override
   public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
       configurer.enable();
   }

   //
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
   
       // LogInterceptor áp dụng cho mọi URL.
       registry.addInterceptor(new LogInterceptor());
 
       // Đường dẫn login cũ, không còn sử dụng nữa.
       // Sử dụng OldURLInterceptor để điều hướng tới một URL mới.
       registry.addInterceptor(new OldLoginInterceptor())//
               .addPathPatterns("/admin/oldLogin");

 
       // Interceptor này áp dụng cho các URL có dạng /admin/*
       // Loại đi trường hợp /admin/oldLogin
       registry.addInterceptor(new AdminInterceptor())//
               .addPathPatterns("/admin/*")//
               .excludePathPatterns("/admin/oldLogin");
   }

}

5- Interceptor classes

LogInterceptor được áp dụng cho mọi request đang tiến đến một Controller. (Xem cấu hình trong WebMvcConfig).

LogInterceptor. java


package org.o7planning.springmvcinterceptor.interceptor;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class LogInterceptor extends HandlerInterceptorAdapter {

   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
           throws Exception {
       long startTime = System.currentTimeMillis();
       System.out.println("\n-------- LogInterception.preHandle --- ");
       System.out.println("Request URL: " + request.getRequestURL());
       System.out.println("Start Time: " + System.currentTimeMillis());

       request.setAttribute("startTime", startTime);
       
       return true;
   }

   @Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
           ModelAndView modelAndView) throws Exception {
       System.out.println("\n-------- LogInterception.postHandle --- ");
       System.out.println("Request URL: " + request.getRequestURL());
 
       // Ở đây, bạn có thể add các attribute vào modelAndView
       // Và sử dụng nó trong các View (jsp,..)
   }

   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
           throws Exception {
       System.out.println("\n-------- LogInterception.afterCompletion --- ");

       long startTime = (Long) request.getAttribute("startTime");
       long endTime = System.currentTimeMillis();
       System.out.println("Request URL: " + request.getRequestURL());
       System.out.println("End Time: " + endTime);

       System.out.println("Time Taken: " + (endTime - startTime));
   }

}

OldLoginInterceptor là một chốt chặn (interceptor), nếu người dùng nhập vào đường dẫn /admin/oldLogin nó sẽ chuyển hướng tới đường dẫn mới là /admin/login.



OldLoginInterceptor. java


package org.o7planning.springmvcinterceptor.interceptor;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class OldLoginInterceptor extends HandlerInterceptorAdapter {

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

       System.out.println("\n-------- OldLoginInterceptor.preHandle --- ");
       System.out.println("Request URL: " + request.getRequestURL());
       System.out.println("Sorry! This URL is no longer used, Redirect to /admin/login");
 
       response.sendRedirect(request.getContextPath()+"/admin/login");
       return false;
   }

   @Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
           ModelAndView modelAndView) throws Exception {
     
  
       // Đoạn code này sẽ không được chạy.
       System.out.println("\n-------- OldLoginInterceptor.postHandle --- ");
   }

   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
           throws Exception {
   
       // Đoạn code này sẽ không được chạy.      
       System.out.println("\n-------- QueryStringInterceptor.afterCompletion --- ");
   }

}

AdminInterceptor. java


package org.o7planning.springmvcinterceptor.interceptor;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class AdminInterceptor extends HandlerInterceptorAdapter {

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

        System.out.println("\n-------- AdminInterceptor.preHandle --- ");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("\n-------- AdminInterceptor.postHandle --- ");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("\n-------- AdminInterceptor.afterCompletion --- ");
    }

}

6- Controllers

MainController. java


package org.o7planning.springmvcinterceptor.controller;

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

@Controller
public class MainController {

  @RequestMapping(value = { "/", "/test" })
  public String test(Model model) {

      System.out.println("\n-------- MainController.test --- ");

      System.out.println(" ** You are in Controller ** ");

      return "test";
  }


  // Đường dẫn này không còn sử dụng nữa.
  // Nó sẽ bị chuyển hướng bởi OldLoginInterceptor
  @Deprecated
  @RequestMapping(value = { "/admin/oldLogin" })
  public String oldLogin(Model model) {

      // Code ở đây không bao giờ được chạy.

      return "oldLogin";
  }

  @RequestMapping(value = { "/admin/login" })
  public String login(Model model) {

      System.out.println("\n-------- MainController.login --- ");

      System.out.println(" ** You are in Controller ** ");

      return "login";
  }

}

7- Chạy ứng dụng




Chạy đường dẫn:

Và đây là Log xem trên màn hình Console:


Chạy URL :

Xem Log:

Rate this post
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments