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

springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法

 更新時(shí)間:2023年07月11日 14:30:54   作者:cying2029  
這篇文章主要介紹了springboot攔截器不攔截靜態(tài)資源,只攔截controller的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

springboot攔截器不攔截靜態(tài)資源,只攔截controller

攔截器攔截靜態(tài)資源問(wèn)題

實(shí)現(xiàn)攔截器的做法就是實(shí)現(xiàn)HandlerInterceptor然后再WebMvcConfigurer里配置攔截器

這個(gè)時(shí)候,一般要手動(dòng)添加過(guò)濾的靜態(tài)資源路徑,如果靜態(tài)資源路徑修改,則攔截器要修改

如果有添加其他攔截/**的攔截器,也需要配置靜過(guò)濾態(tài)資源路徑

@Configuration
public class WebConfigurer implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"};
        registry.addInterceptor(loginInterceptor).excludePathPatterns(strs);
    }
}

只攔截controller方法

利用HandlerInterceptor 接口的handler

如果是controller的方法,handler為 HandlerMethod

如果是資源類(lèi),handler為 org.springframework.web.servlet.resource.ResourceHttpRequestHandler

public interface HandlerInterceptor {
    default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        return true;
    }
	...

實(shí)現(xiàn)

加一層抽象類(lèi),新增的攔截器繼承該抽象類(lèi),并在controllerMethodPreHandle方法實(shí)現(xiàn)業(yè)務(wù)功能,即可忽視靜態(tài)資源類(lèi)

public abstract class AbstrctControllerInterceptor implements HandlerInterceptor {
    protected abstract boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException;
    @Override
    public final boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //如果是controller的方法handler為HandlerMethod
        //如果是資源類(lèi)則handler為org.springframework.web.servlet.resource.ResourceHttpRequestHandler
        if(handler instanceof HandlerMethod){
            return controllerMethodPreHandle(request,response,handler);
        }
        //否則不攔截
        return true;
    }
}

登錄攔截器實(shí)現(xiàn)

@Component
public class LoginInterceptor extends AbstrctControllerInterceptor {
    @Override
    protected boolean controllerMethodPreHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
        Object user = request.getSession().getAttribute(ConstantValue.USER_CONTEXT_KEY);
        if(user == null){
            response.sendRedirect("/login");
            return false;
        }
        return true;
    }
}

對(duì)比之前的配置,可以忽視資源路徑了

@Configuration
public class WebConfigurer implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        String []strs = {"/static/**","/project/**","/assets/**","/login","/login.do"};
        String []strs = {"/login","/login.do"};
        registry.addInterceptor(loginInterceptor).excludePathPatterns(strs);
    }
}

springboot攔截器問(wèn)題

Spring Boot 攔截器是 AOP 的一種實(shí)現(xiàn),專(zhuān)門(mén)攔截對(duì)控制層的請(qǐng)求,主要應(yīng)用于判斷用戶(hù)權(quán)限,攔截webSocket請(qǐng)求。

在 Spring Boot 項(xiàng)目中,使用攔截器功能通常需要以下 2 步:

  • 1.創(chuàng)建攔截器;
  • 2.配置攔截器,指定攔截規(guī)則(如果是攔截所有,靜態(tài)資源也會(huì)被攔截)。

第一步:創(chuàng)建攔截器

創(chuàng)建的類(lèi)實(shí)現(xiàn) HandlerInterceptor 接口,即可成為攔截器類(lèi)

HandlerInterceptor 接口中定義以下 3 個(gè)方法,如下表所示。

在這里插入圖片描述

實(shí)例:

/**
 * 自定義攔截器類(lèi)
 */
public class MyInterceptor implements HandlerInterceptor {// 實(shí)現(xiàn)HandlerInterceptor接口
	/**
	 * 訪問(wèn)控制器方法前執(zhí)行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
		return true;
	}
	/**
	 * 訪問(wèn)控制器方法后執(zhí)行
	 */
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		System.out.println(new Date() + "--postHandle:" + request.getRequestURL());
	}
	/**
	 * postHandle方法執(zhí)行完成后執(zhí)行,一般用于釋放資源
	 */
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		System.out.println(new Date() + "--afterCompletion:" + request.getRequestURL());
	}
}

注意:MyInterceptor 中的方法執(zhí)行順序?yàn)?preHandle – Controller 方法 – postHandle – afterCompletion ,所以攔截器實(shí)際上可以對(duì) Controller 方法執(zhí)行前后進(jìn)行攔截監(jiān)控。

第二步:配置攔截器

/**
 * Web配置類(lèi)
 */
@Configuration
public class WebConfig implements WebMvcConfigurer {
	/**
	 * 添加Web項(xiàng)目的攔截器
	 */
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 對(duì)所有訪問(wèn)路徑,都通過(guò)MyInterceptor類(lèi)型的攔截器進(jìn)行攔截
		registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**")
		.excludePathPatterns("/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**");
		 //放行登錄頁(yè),登陸操作,靜態(tài)資源
	}
}

在指定攔截器攔截規(guī)則時(shí),調(diào)用了兩個(gè)方法,這兩個(gè)方法的說(shuō)明如下:

  • addPathPatterns:該方法用于指定攔截路徑,例如攔截路徑為“/**”,表示攔截所有請(qǐng)求,包括對(duì)靜態(tài)資源的請(qǐng)求。
  • excludePathPatterns:該方法用于排除攔截路徑,即指定不需要被攔截器攔截的請(qǐng)求。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論

从江县| 即墨市| 苏州市| 达孜县| 房产| 红河县| 丰镇市| 梁平县| 吴川市| 石楼县| 普安县| 方城县| 炉霍县| 双峰县| 乐昌市| 阳原县| 渭源县| 余干县| 榕江县| 青浦区| 扎赉特旗| 平陆县| 鹰潭市| 黑山县| 陆河县| 甘孜| 遂溪县| 德格县| 德钦县| 兴仁县| 哈巴河县| 拉萨市| 白河县| 台湾省| 喜德县| 平江县| 长寿区| 皮山县| 托克逊县| 静乐县| 夏河县|