tianyun 2 年 前
コミット
db44dc546d

+ 4 - 0
springboot-main/pom.xml

@@ -49,6 +49,10 @@
             <artifactId>commons-pool2</artifactId>
             <version>2.11.1</version>
         </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 14 - 1
springboot-main/src/main/java/com/alvin/Application.java

@@ -1,12 +1,25 @@
 package com.alvin;
 
 
+import com.alvin.filters.SecurityInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
 @SpringBootApplication
-public class Application {
+public class Application implements WebMvcConfigurer {
     public static void main(String[] args) throws Exception {
         SpringApplication.run(Application.class);
     }
+
+    @Autowired
+    private SecurityInterceptor securityInterceptor;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        //加入的顺序就是拦截器执行的顺序,可以加入多个
+        registry.addInterceptor(securityInterceptor).addPathPatterns("/**");
+    }
 }

+ 14 - 0
springboot-main/src/main/java/com/alvin/controller/TestController.java

@@ -0,0 +1,14 @@
+package com.alvin.controller;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/test")
+public class TestController {
+    @GetMapping("/test")
+    public String test() {
+        return "123";
+    }
+}

+ 34 - 0
springboot-main/src/main/java/com/alvin/filters/MyFilter.java

@@ -0,0 +1,34 @@
+package com.alvin.filters;
+
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+@Order(1)  // 越小越先执行
+@WebFilter(filterName = "myFilter", urlPatterns = "/*")
+@Component
+public class MyFilter implements Filter {
+
+
+    @Override
+    public void init(FilterConfig filterConfig) throws ServletException {
+        System.out.println("init...");
+    }
+
+    @Override
+    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
+        HttpServletRequest request = (HttpServletRequest) servletRequest;
+        String requestURI = request.getRequestURI();
+        System.out.println("成功啦。。。, 请求URI是:" + requestURI);
+        filterChain.doFilter(request, servletResponse);
+    }
+
+    @Override
+    public void destroy() {
+        System.out.println("destroy...");
+    }
+}

+ 62 - 0
springboot-main/src/main/java/com/alvin/filters/SecurityInterceptor.java

@@ -0,0 +1,62 @@
+package com.alvin.filters;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+@Slf4j
+@Component
+public class SecurityInterceptor implements HandlerInterceptor {
+    /**
+     * 在执行具体的Controller方法之前调用
+     *
+     * @param request
+     * @param response
+     * @param handler
+     * @return
+     * @throws Exception
+     */
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        String header = request.getHeader("req-name");
+        return true;
+    }
+
+    /**
+     * controller执行完毕之后被调用,在 DispatcherServlet 进行视图返回渲染之前被调用,
+     * 所以我们可以在这个方法中对 Controller 处理之后的 ModelAndView 对象进行操作。
+     * <p>
+     * preHandler 返回false,这个也不会执行
+     *
+     * @param request
+     * @param response
+     * @param handler
+     * @param modelAndView
+     * @throws Exception
+     */
+    @Override
+    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
+        log.info("执行完毕!");
+        response.setHeader("res", "postHandler");
+    }
+
+
+    /**
+     * 方法需要在当前对应的 Interceptor 类的 preHandle 方法返回值为 true 时才会执行。
+     * 顾名思义,该方法将在整个请求结束之后,也就是在 DispatcherServlet 渲染了对应的视图之后执行。此方法主要用来进行资源清理。
+     *
+     * @param request
+     * @param response
+     * @param handler
+     * @param ex
+     * @throws Exception
+     */
+    @Override
+    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
+        log.info("回收");
+    }
+}