最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MVC中的攔截器實(shí)現(xiàn)案例解析

 更新時間:2026年04月03日 08:45:56   作者:程序員Seven  
攔截器(Interceptor)依賴于web框架,在SpringMVC中就是依賴于SpringMVC框架,本文介紹MVC中的攔截器實(shí)現(xiàn)案例,感興趣的朋友跟隨小編一起看看吧

MVC 攔截器

Spring MVC 攔截器對應(yīng)HandlerInterctor接口,該接口位于org.springframework.web.servlet的包中,定義了三個方法,若要實(shí)現(xiàn)該接口,就要實(shí)現(xiàn)其三個方法:

  • 前置處理(preHandle()方法):該方法在執(zhí)行控制器方法之前執(zhí)行。返回值為Boolean類型,如果返回false,表示攔截請求,不再向下執(zhí)行,如果返回true,表示放行,程序繼續(xù)向下執(zhí)行(如果后面沒有其他Interceptor,就會執(zhí)行controller方法)。所以此方法可對請求進(jìn)行判斷,決定程序是否繼續(xù)執(zhí)行,或者進(jìn)行一些初始化操作及對請求進(jìn)行預(yù)處理。
  • 后置處理(postHandle()方法):該方法在執(zhí)行控制器方法調(diào)用之后,且在返回ModelAndView之前執(zhí)行。由于該方法會在DispatcherServlet進(jìn)行返回視圖渲染之前被調(diào)用,所以此方法多被用于處理返回的視圖,可通過此方法對請求域中的模型和視圖做進(jìn)一步的修改。
  • 已完成處理(afterCompletion()方法):該方法在執(zhí)行完控制器之后執(zhí)行,由于是在Controller方法執(zhí)行完畢后執(zhí)行該方法,所以該方法適合進(jìn)行一些資源清理,記錄日志信息等處理操作。

可以通過攔截器進(jìn)行權(quán)限檢驗(yàn),參數(shù)校驗(yàn),記錄日志等操作

攔截器 (Interceptor) 實(shí)現(xiàn)案例

攔截器(Interceptor)依賴于web框架,在SpringMVC中就是依賴于SpringMVC框架。在實(shí)現(xiàn)上,基于Java的反射機(jī)制,屬于面向切面編程(AOP)的一種運(yùn)用。

就是在service或者一個方法前,調(diào)用一個方法,或者在方法后,調(diào)用一個方法,比如動態(tài)代理就是攔截器的簡單實(shí)現(xiàn),在調(diào)用方法前打印出字符串(或者做其它業(yè)務(wù)邏輯的操作)。

也可以在調(diào)用方法后打印出字符串,甚至在拋出異常的時候做業(yè)務(wù)邏輯的操作。由于攔截器是基于web框架的調(diào)用,因此可以使用Spring的依賴注入(DI)進(jìn)行一些業(yè)務(wù)操作,同時一個攔截器實(shí)例在一個controller生命周期之內(nèi)可以多次調(diào)用。

但是缺點(diǎn)是只能對controller請求進(jìn)行攔截,對其他的一些比如直接訪問靜態(tài)資源的請求則沒辦法進(jìn)行攔截處理。

自定義攔截器實(shí)現(xiàn)

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;
import java.util.Arrays;
import java.util.Map;
/**
 * 自定義攔截器 - 實(shí)現(xiàn)HandlerInterceptor接口
 * 適用于業(yè)務(wù)相關(guān)的預(yù)處理和后處理
 */
@Component
public class CustomInterceptor implements HandlerInterceptor {
    private static final ThreadLocal<Long> startTimeThreadLocal = new ThreadLocal<>();
    /**
     * 預(yù)處理回調(diào)方法 - 在控制器執(zhí)行之前調(diào)用
     * 返回true表示繼續(xù)執(zhí)行,false表示中斷執(zhí)行
     */
    @Override
    public boolean preHandle(HttpServletRequest request, 
                           HttpServletResponse response, 
                           Object handler) throws Exception {
        // 記錄請求開始時間
        startTimeThreadLocal.set(System.currentTimeMillis());
        // 獲取請求信息
        String requestURI = request.getRequestURI();
        String method = request.getMethod();
        String clientIP = getClientIP(request);
        System.out.println("【攔截器-preHandle】請求開始: " + method + " " + requestURI);
        System.out.println("【攔截器-preHandle】客戶端IP: " + clientIP);
        // 1. 權(quán)限驗(yàn)證示例
        if (requiresAuth(requestURI) && !isAuthenticated(request)) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "未授權(quán)訪問");
            return false; // 中斷請求
        }
        // 2. 參數(shù)預(yù)處理示例
        Map<String, String[]> params = request.getParameterMap();
        if (!params.isEmpty()) {
            System.out.println("【攔截器-preHandle】請求參數(shù): " + paramsToString(params));
        }
        // 3. 設(shè)置請求屬性,供控制器使用
        request.setAttribute("requestStartTime", System.currentTimeMillis());
        return true; // 繼續(xù)執(zhí)行后續(xù)攔截器和控制器
    }
    /**
     * 后處理回調(diào)方法 - 在控制器執(zhí)行之后,視圖渲染之前調(diào)用(返回ModelAndView之前)
     */
    @Override
    public void postHandle(HttpServletRequest request, 
                          HttpServletResponse response, 
                          Object handler, 
                          ModelAndView modelAndView) throws Exception {
        Long startTime = startTimeThreadLocal.get();
        if (startTime != null) {
            long costTime = System.currentTimeMillis() - startTime;
            System.out.println("【攔截器-postHandle】請求處理耗時: " + costTime + "ms");
            // 可以修改ModelAndView
            if (modelAndView != null) {
                modelAndView.addObject("processTime", costTime);
                modelAndView.addObject("interceptorMessage", "經(jīng)過攔截器處理");
            }
        }
    }
    /**
     * 完成回調(diào)方法 - 在整個請求完成之后調(diào)用(視圖渲染完成后)
     * 適合進(jìn)行資源清理
     */
    @Override
    public void afterCompletion(HttpServletRequest request, 
                               HttpServletResponse response, 
                               Object handler, 
                               Exception ex) throws Exception {
        Long startTime = startTimeThreadLocal.get();
        if (startTime != null) {
            long totalTime = System.currentTimeMillis() - startTime;
            int status = response.getStatus();
            System.out.println("【攔截器-afterCompletion】請求完成: " + 
                request.getRequestURI() + " 狀態(tài): " + status + " 總耗時: " + totalTime + "ms");
            if (ex != null) {
                System.err.println("【攔截器-afterCompletion】異常信息: " + ex.getMessage());
            }
            // 清理ThreadLocal,防止內(nèi)存泄漏
            startTimeThreadLocal.remove();
        }
    }
    // ========== 工具方法 ==========
    private String getClientIP(HttpServletRequest request) {
        String ip = request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        return ip;
    }
    private boolean requiresAuth(String uri) {
        // 需要認(rèn)證的路徑規(guī)則
        return uri.startsWith("/api/admin") || uri.startsWith("/api/user");
    }
    private boolean isAuthenticated(HttpServletRequest request) {
        // 簡單的認(rèn)證檢查
        String token = request.getHeader("Authorization");
        return token != null && token.startsWith("Bearer ");
    }
    private String paramsToString(Map<String, String[]> params) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String[]> entry : params.entrySet()) {
            sb.append(entry.getKey()).append("=")
              .append(Arrays.toString(entry.getValue())).append("; ");
        }
        return sb.toString();
    }
}

攔截器配置

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.Arrays;
import java.util.List;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
    @Autowired
    private CustomInterceptor customInterceptor;
    // 排除路徑
    private static final List<String> EXCLUDE_PATHS = Arrays.asList(
        "/api/public/**",
        "/static/**",
        "/error",
        "/login",
        "/logout"
    );
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注冊自定義攔截器
        registry.addInterceptor(customInterceptor)
                .addPathPatterns("/**")                    // 攔截所有路徑
                .excludePathPatterns(EXCLUDE_PATHS);        // 排除特定路徑
        // 可以注冊多個攔截器,按添加順序執(zhí)行
        registry.addInterceptor(new LoggingInterceptor())
                .addPathPatterns("/api/**")
                .order(1); // 設(shè)置執(zhí)行順序,數(shù)字越小優(yōu)先級越高
    }
}
/**
 * 另一個日志攔截器示例
 */
class LoggingInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("【日志攔截器】請求路徑: " + request.getRequestURI());
        return true;
    }
}

過濾器 (Filter) 實(shí)現(xiàn)案例

過濾器 (Filter) 依賴于servlet容器。在實(shí)現(xiàn)上,基于函數(shù)回調(diào),它可以對幾乎所有請求進(jìn)行過濾,但是缺點(diǎn)是一個過濾器實(shí)例只能在容器初始化時調(diào)用一次。

使用過濾器的目的,是用來做一些過濾操作,獲取我們想要獲取的數(shù)據(jù)。

比如:在Javaweb中,對傳入的request、response提前過濾掉一些信息,或者提前設(shè)置一些參數(shù),然后再傳入servlet或者Controller進(jìn)行業(yè)務(wù)邏輯操作。

通常用的場景是:在過濾器中修改字符編碼(CharacterEncodingFilter)、在過濾器中修改HttpServletRequest的一些參數(shù)(XSSFilter(自定義過濾器))。

如:過濾低俗文字、危險字符等。

自定義過濾器實(shí)現(xiàn)

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * 自定義過濾器 - 實(shí)現(xiàn)Filter接口
 * 適用于通用的請求/響應(yīng)處理
 */
@Component
@Order(1) // 執(zhí)行順序,數(shù)字越小優(yōu)先級越高
public class CustomFilter implements Filter {
    /**
     * 初始化方法
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("【過濾器】CustomFilter初始化完成");
    }
    /**
     * 過濾處理方法
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                        FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        long startTime = System.currentTimeMillis();
        System.out.println("【過濾器-doFilter】請求進(jìn)入: " + httpRequest.getRequestURI());
        // 1. 設(shè)置字符編碼
        httpRequest.setCharacterEncoding("UTF-8");
        httpResponse.setCharacterEncoding("UTF-8");
        httpResponse.setContentType("text/html;charset=UTF-8");
        // 2. 設(shè)置CORS頭(跨域支持)
        httpResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpResponse.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
        httpResponse.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
        // 3. 預(yù)處理邏輯
        if (isOptionsRequest(httpRequest)) {
            // 處理預(yù)檢請求
            httpResponse.setStatus(HttpServletResponse.SC_OK);
            return;
        }
        // 4. 請求包裝(可以修改請求參數(shù))
        CustomHttpServletRequestWrapper wrappedRequest = 
            new CustomHttpServletRequestWrapper(httpRequest);
        // 5. 響應(yīng)包裝(可以修改響應(yīng)內(nèi)容)
        CustomHttpServletResponseWrapper wrappedResponse = 
            new CustomHttpServletResponseWrapper(httpResponse);
        try {
            // 繼續(xù)執(zhí)行過濾器鏈
            chain.doFilter(wrappedRequest, wrappedResponse);
            // 后處理邏輯
            long costTime = System.currentTimeMillis() - startTime;
            System.out.println("【過濾器-doFilter】請求完成: " + 
                httpRequest.getRequestURI() + " 耗時: " + costTime + "ms");
            // 可以在這里修改響應(yīng)內(nèi)容
            byte[] responseData = wrappedResponse.getData();
            if (responseData.length > 0) {
                // 對響應(yīng)數(shù)據(jù)進(jìn)行處理
                String modifiedResponse = modifyResponse(new String(responseData));
                response.getOutputStream().write(modifiedResponse.getBytes());
            }
        } catch (Exception e) {
            // 異常處理
            System.err.println("【過濾器-doFilter】處理異常: " + e.getMessage());
            httpResponse.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "服務(wù)器內(nèi)部錯誤");
        }
    }
    /**
     * 銷毀方法
     */
    @Override
    public void destroy() {
        System.out.println("【過濾器】CustomFilter銷毀");
    }
    // ========== 工具方法 ==========
    private boolean isOptionsRequest(HttpServletRequest request) {
        return "OPTIONS".equalsIgnoreCase(request.getMethod());
    }
    private String modifyResponse(String originalResponse) {
        // 簡單的響應(yīng)內(nèi)容修改示例
        return originalResponse.replace("舊內(nèi)容", "新內(nèi)容");
    }
}
/**
 * 自定義請求包裝器 - 用于修改請求參數(shù)
 */
class CustomHttpServletRequestWrapper extends HttpServletRequestWrapper {
    public CustomHttpServletRequestWrapper(HttpServletRequest request) {
        super(request);
    }
    @Override
    public String getParameter(String name) {
        // 可以在這里修改請求參數(shù)
        String value = super.getParameter(name);
        if ("username".equals(name) && value != null) {
            return value.trim(); // 去除用戶名前后空格
        }
        return value;
    }
}
/**
 * 自定義響應(yīng)包裝器 - 用于捕獲和修改響應(yīng)內(nèi)容
 */
class CustomHttpServletResponseWrapper extends HttpServletResponseWrapper {
    private final CustomServletOutputStream outputStream;
    private final PrintWriter printWriter;
    public CustomHttpServletResponseWrapper(HttpServletResponse response) {
        super(response);
        this.outputStream = new CustomServletOutputStream();
        this.printWriter = new PrintWriter(outputStream);
    }
    @Override
    public ServletOutputStream getOutputStream() {
        return outputStream;
    }
    @Override
    public PrintWriter getWriter() {
        return printWriter;
    }
    public byte[] getData() {
        try {
            printWriter.flush();
            return outputStream.toByteArray();
        } catch (IOException e) {
            return new byte[0];
        }
    }
}
/**
 * 自定義Servlet輸出流
 */
class CustomServletOutputStream extends ServletOutputStream {
    private final ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    @Override
    public void write(int b) {
        buffer.write(b);
    }
    @Override
    public boolean isReady() {
        return true;
    }
    @Override
    public void setWriteListener(WriteListener listener) {
        // 不需要實(shí)現(xiàn)
    }
    public byte[] toByteArray() {
        return buffer.toByteArray();
    }
}

過濾器配置(多種方式)

  • 使用 @Component + @Order(推薦): 上面的示例已經(jīng)使用這種方式
  • 使用 FilterRegistrationBean(更靈活)
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean<CustomFilter> customFilterRegistration() {
        FilterRegistrationBean<CustomFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new CustomFilter());
        registration.addUrlPatterns("/*"); // 過濾所有請求
        registration.setOrder(1); // 執(zhí)行順序
        registration.setName("customFilter");
        // 可以設(shè)置初始化參數(shù)
        registration.addInitParameter("param1", "value1");
        return registration;
    }
    @Bean
    public FilterRegistrationBean<LoggingFilter> loggingFilterRegistration() {
        FilterRegistrationBean<LoggingFilter> registration = new FilterRegistrationBean<>();
        registration.setFilter(new LoggingFilter());
        registration.addUrlPatterns("/api/*");
        registration.setOrder(2);
        return registration;
    }
}
/**
 * 日志過濾器
 */
class LoggingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, 
                        FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        System.out.println("【日志過濾器】請求: " + httpRequest.getMethod() + " " + httpRequest.getRequestURI());
        chain.doFilter(request, response);
    }
}
  • 使用 @WebFilter 注解
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
@WebFilter(
    urlPatterns = "/*",
    initParams = {
        @WebInitParam(name = "encoding", value = "UTF-8"),
        @WebInitParam(name = "enableCors", value = "true")
    }
)
public class AnnotationFilter implements Filter {
    // 實(shí)現(xiàn)同上
}

需要在啟動類添加 @ServletComponentScan

@SpringBootApplication
@ServletComponentScan // 掃描@WebFilter、@WebServlet等注解
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

MVC 的Interctor和 Filter 過濾器的區(qū)別

  • 功能相同:Interctor和 Filter 都能實(shí)現(xiàn)相應(yīng)的功能
  • 容器不同:Interctor構(gòu)建在 Spring MVC 體系中;Filter 構(gòu)建在 Servlet 容器之上
  • 攔截內(nèi)容不同:Filter對所有訪問進(jìn)行增強(qiáng),Interctor僅對MVC訪問進(jìn)行增強(qiáng)
  • 使用便利性不同:Interctor提供了三個方法,分別在不同的時機(jī)執(zhí)行;過濾器僅提供一個方法

使用場景區(qū)別

  • 使用攔截器的場景:
    • 業(yè)務(wù)邏輯處理:權(quán)限驗(yàn)證、日志記錄、參數(shù)預(yù)處理
    • 需要訪問Spring上下文:需要注入Spring Bean的業(yè)務(wù)
    • 控制器相關(guān)處理:只需要對Spring MVC管理的請求進(jìn)行處理
    • 需要修改ModelAndView:在視圖渲染前修改模型數(shù)據(jù)
  • 使用過濾器的場景:
    • 通用請求處理:字符編碼、CORS支持、壓縮處理
    • 靜態(tài)資源處理:需要對所有請求(包括靜態(tài)資源)進(jìn)行處理
    • 底層請求處理:需要在DispatcherServlet之前執(zhí)行的邏輯
    • 請求/響應(yīng)包裝:需要修改請求參數(shù)或響應(yīng)內(nèi)容

組合使用示例

/**
 * 完整的請求處理鏈?zhǔn)纠?
 * 過濾器(通用處理) → 攔截器(業(yè)務(wù)處理) → 控制器
 */
// 1. 過濾器:處理字符編碼、CORS等通用邏輯
@Component
@Order(1)
public class GlobalFilter implements Filter {
    // 處理所有請求的通用邏輯
}
// 2. 攔截器:處理業(yè)務(wù)相關(guān)的邏輯
@Component  
public class AuthInterceptor implements HandlerInterceptor {
    // 處理需要認(rèn)證的業(yè)務(wù)邏輯
}
// 3. 控制器:處理具體業(yè)務(wù)
@RestController
public class BusinessController {
    // 業(yè)務(wù)實(shí)現(xiàn)
}

過濾器和攔截器執(zhí)行順序

請求進(jìn)入 → 過濾器預(yù)處理 → Spring MVC 核心處理 → 攔截器預(yù)處理 → 控制器執(zhí)行 → 攔截器后處理 → 攔截器完成處理 → 過濾器后處理 → 響應(yīng)返回

詳細(xì)執(zhí)行步驟分解:

第一階段:過濾器預(yù)處理(Filter Pre-processing)

  • 進(jìn)入過濾器:客戶端請求首先到達(dá) Servlet 容器
  • 執(zhí)行 chain.doFilter(request, response)之前的邏輯:
    • 對請求進(jìn)行通用預(yù)處理
    • 常見操作:設(shè)置字符編碼、添加 CORS 頭部、安全檢查、請求日志記錄
    • 此時尚未進(jìn)入 Spring MVC 框架

第二階段:Spring MVC 核心分發(fā)

  • Servlet 的 service()方法:請求進(jìn)入 Servlet 容器處理流程
  • Spring MVC 的 doService()方法:Spring MVC 框架開始接管請求
  • Spring MVC 請求分發(fā)方法:DispatcherServlet根據(jù) URL 映射確定對應(yīng)的處理器(Handler)

第三階段:攔截器預(yù)處理

  • 進(jìn)入攔截器:請求正式進(jìn)入 Spring MVC 的攔截器鏈
  • 執(zhí)行 Controller之前調(diào)用 preHandle()
    • 進(jìn)行業(yè)務(wù)相關(guān)的預(yù)處理
    • 常見操作:用戶認(rèn)證、權(quán)限檢查、參數(shù)驗(yàn)證、業(yè)務(wù)日志
    • 返回值控制:
      • true:繼續(xù)執(zhí)行后續(xù)攔截器和控制器
      • false:中斷請求,直接返回

第四階段:控制器執(zhí)行

  • 執(zhí)行具體的業(yè)務(wù)邏輯
  • 準(zhǔn)備模型數(shù)據(jù)(Model)
  • 確定視圖信息(View)

第五階段:攔截器后處理

  • postHandle()方法執(zhí)行:
    • 時機(jī):控制器邏輯執(zhí)行完畢,但在返回 ModelAndView之前
    • 能力:可以查看和修改控制器返回的 ModelAndView對象
    • 常見操作:添加全局模型數(shù)據(jù)、記錄處理結(jié)果、統(tǒng)一響應(yīng)格式

第六階段:攔截器完成處理,afterCompletion()方法執(zhí)行:

  • 時機(jī):控制器已經(jīng)返回 ModelAndView,但在過濾器將響應(yīng)返回給客戶端之前
  • 特點(diǎn):無論請求成功還是異常,都會執(zhí)行(類似 finally塊)
  • 常見操作:清理 ThreadLocal 資源、記錄最終處理狀態(tài)、性能監(jiān)控

第七階段:過濾器后處理,FilterAfter邏輯執(zhí)行:

  • 時機(jī):服務(wù)器端所有邏輯執(zhí)行完成,準(zhǔn)備將響應(yīng)返回給客戶端之前
  • 常見操作:響應(yīng)壓縮、添加安全頭部、響應(yīng)日志記錄、編碼最后確認(rèn)

多攔截器執(zhí)行順序

  • 當(dāng)配置多個攔截器時,會形成攔截器鏈
  • 攔截器的運(yùn)行順序參照攔截器添加順序?yàn)闇?zhǔn),即addInterctor的順序(過濾器同理)
  • 當(dāng)攔截器中出現(xiàn)對原始處理器的攔截,后面的攔截器均終止運(yùn)行
  • 當(dāng)攔截器運(yùn)行中斷,僅運(yùn)行配置在前面的攔截器afterCompletion

流程解析看下圖:

到此這篇關(guān)于MVC中的攔截器實(shí)現(xiàn)案例的文章就介紹到這了,更多相關(guān)MVC攔截器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解java.lang.reflect.Modifier.isInterface()方法

    詳解java.lang.reflect.Modifier.isInterface()方法

    這篇文章主要介紹了詳解java.lang.reflect.Modifier.isInterface()方法的相關(guān)資料,這里提供實(shí)例幫助大家理解這個方法的使用,需要的朋友可以參考下
    2017-09-09
  • Java方法參數(shù)是引用調(diào)用還是值調(diào)用?

    Java方法參數(shù)是引用調(diào)用還是值調(diào)用?

    Java方法參數(shù)是引用調(diào)用還是值調(diào)用?這是一個值得思考的問題。閱讀本文,找出答案
    2016-02-02
  • java 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)

    java 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)

    下面小編就為大家?guī)硪黄猨ava 查詢oracle數(shù)據(jù)庫所有表DatabaseMetaData的用法(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • Maven插件之Dependency:analyze的使用

    Maven插件之Dependency:analyze的使用

    在軟件開發(fā)中,合理管理項(xiàng)目依賴是保證構(gòu)建穩(wěn)定性的關(guān)鍵,Maven作為流行的項(xiàng)目管理工具,提供了Dependency插件來幫助開發(fā)者分析和優(yōu)化項(xiàng)目依賴,通過執(zhí)行dependency:analyze指令,可以辨識項(xiàng)目中使用的、未聲明的、和未使用的依賴項(xiàng)
    2024-10-10
  • Java 知識難點(diǎn)之異常的認(rèn)知與使用詳解

    Java 知識難點(diǎn)之異常的認(rèn)知與使用詳解

    所謂異常是指程序在運(yùn)行時出現(xiàn)錯誤時提示調(diào)用者的機(jī)制,異常的種類有很多,不同種類的異常有不同的含義,也有不同的處理方式,通讀本篇對大家的學(xué)習(xí)或工作具有一定的價值,需要的朋友可以參考下
    2021-09-09
  • 解析Java中的默認(rèn)方法

    解析Java中的默認(rèn)方法

    這篇文章主要介紹了Java中的默認(rèn)方法,包括繼承和調(diào)用等Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-07-07
  • springboot實(shí)現(xiàn)異步任務(wù)

    springboot實(shí)現(xiàn)異步任務(wù)

    這篇文章主要為大家詳細(xì)介紹了springboot實(shí)現(xiàn)異步任務(wù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05
  • Linux下java環(huán)境配置圖文方法

    Linux下java環(huán)境配置圖文方法

    這篇文章主要介紹了Linux下java環(huán)境配置圖文方法,需要的朋友可以參考下
    2023-06-06
  • Java快速開發(fā)平臺若依、芋道、Jeesite、JeecgBoot詳細(xì)對比

    Java快速開發(fā)平臺若依、芋道、Jeesite、JeecgBoot詳細(xì)對比

    Java快速開發(fā)平臺是現(xiàn)代企業(yè)級Java應(yīng)用研發(fā)過程中提升效率、降低重復(fù)勞動、加速交付周期的關(guān)鍵技術(shù)支撐體系,這篇文章主要介紹了Java快速開發(fā)平臺若依、芋道、Jeesite、JeecgBoot詳細(xì)對比的相關(guān)資料,需要的朋友可以參考下
    2026-05-05
  • javaCV視頻處理之提取人像視頻

    javaCV視頻處理之提取人像視頻

    這篇文章主要介紹了利用JavaCV實(shí)現(xiàn)提取視頻中的人像并保存為視頻,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)JavaCV有一定的幫助,需要的可以參考一下
    2021-12-12

最新評論

富裕县| 乌什县| 宁化县| 佳木斯市| 呼玛县| 哈尔滨市| 北流市| 芦溪县| 莱阳市| 民丰县| 金塔县| 湖南省| 嘉祥县| 西峡县| 清水县| 汕尾市| 舟山市| 奈曼旗| 禹城市| 清镇市| 贵溪市| 新乡市| 忻州市| 呼和浩特市| 永定县| 安龙县| 鄂州市| 泸西县| 天津市| 固始县| 东平县| 台州市| 桃源县| 来宾市| 普安县| 遂溪县| 梓潼县| 济阳县| 哈巴河县| 万荣县| 尤溪县|