最新国产好看的视频,伊人天堂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à)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

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

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

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

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

如果有添加其他攔截/**的攔截器,也需要配置靜過濾態(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

如果是資源類,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)

加一層抽象類,新增的攔截器繼承該抽象類,并在controllerMethodPreHandle方法實(shí)現(xiàn)業(yè)務(wù)功能,即可忽視靜態(tà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
        //如果是資源類則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;
    }
}

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

@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攔截器問題

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

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

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

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

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

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

在這里插入圖片描述

實(shí)例:

/**
 * 自定義攔截器類
 */
public class MyInterceptor implements HandlerInterceptor {// 實(shí)現(xiàn)HandlerInterceptor接口
	/**
	 * 訪問控制器方法前執(zhí)行
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(new Date() + "--preHandle:" + request.getRequestURL());
		return true;
	}
	/**
	 * 訪問控制器方法后執(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í)際上可以對 Controller 方法執(zhí)行前后進(jìn)行攔截監(jiān)控。

第二步:配置攔截器

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

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

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

總結(jié)

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

相關(guān)文章

最新評論

曲阳县| 寿阳县| 盖州市| 吉安市| 左云县| 新巴尔虎右旗| 赤城县| 兴仁县| 镇赉县| 海丰县| 漠河县| 进贤县| 涪陵区| 黎城县| 呼和浩特市| 宜宾县| 扬州市| 策勒县| 特克斯县| 集贤县| 博罗县| 长垣县| 博白县| 遂宁市| 江永县| 镇巴县| 大安市| 杭锦后旗| 上林县| 广东省| 彩票| 惠州市| 太仓市| 巍山| 长泰县| 潜江市| 左权县| 罗山县| 咸阳市| 岳普湖县| 新民市|