攔截器的作用之session認證登錄和資源攔截


背景: 在項目中我使用了自定義的Filter 這時候過濾了很多路徑,當然對靜態資源我是直接放過去的,但是,還是出現了靜態資源沒辦法訪問到springboot默認的文件夾中得文件。另外,經常需要判斷當前訪問者是否有權操作某個資源。

靜態資源攔截

說下默認映射的文件夾有:

classpath:/META-INF/resources

  • classpath:/resources

  • classpath:/static

  • classpath:/public

上面這幾個都是靜態資源的映射路徑,優先級順序為:META-INF/resources > resources > static > public

我們可以通過修改spring.mvc.static-path-pattern來修改默認的映射**

****************接管Spring Boot的Web配置 ********* 這是重點中得重點*************

 

如果Spring Boot提供的Sping MVC不符合要求,則可以通過一個配置類(注解有@Configuration的類)加上@EnableWebMvc注解來實現完全自己控制的MVC配置。

當然,通常情況下,Spring Boot的自動配置是符合我們大多數需求的。在你既需要保留Spring Boot提供的便利,有需要增加自己的額外的配置的時候,可以定義一個配置類並繼承WebMvcConfigurerAdapter,無需使用@EnableWebMvc注解。

這里我們提到這個WebMvcConfigurerAdapter這個類,重寫這個類中的方法可以讓我們增加額外的配置

自定義資源映射addResourceHandlers

比如,我們想自定義靜態資源映射目錄的話,只需重寫addResourceHandlers方法即可。

通過addResourceHandler添加映射路徑,然后通過addResourceLocations來指定路徑。我們訪問自定義my文件夾中

@Configuration public class MyWebMvcConfigurerAdapter extends WebMvcConfigurerAdapter { /** * 配置靜態訪問資源 * @param registry */ @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/my/**").addResourceLocations("classpath:/my/"); super.addResourceHandlers(registry); } }

如果你想指定外部的目錄也很簡單,直接addResourceLocations指定即可,代碼如下:

public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/my/**").addResourceLocations("file:E:/my/");
        super.addResourceHandlers(registry);
    }

addResourceLocations指的是文件放置的目錄,addResoureHandler指的是對外暴露的訪問路徑

頁面跳轉addViewControllers

以前寫SpringMVC的時候,如果需要訪問一個頁面,必須要寫Controller類,然后再寫一個方法跳轉到頁面,感覺好麻煩,其實重寫WebMvcConfigurerAdapter中的addViewControllers方法即可達到效果了

/**
     * 以前要訪問一個頁面需要先創建個Controller控制類,再寫方法跳轉到頁面
     * 在這里配置后就不需要那么麻煩了,直接訪問http://localhost:8080/toLogin就跳轉到login.jsp頁面了
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/toLogin").setViewName("login");
        super.addViewControllers(registry);
    }

攔截器在我們項目中經常使用的,這里就來介紹下最簡單的判斷是否登錄的使用。
要實現攔截器功能需要完成以下2個步驟:

  • 創建我們自己的攔截器類並實現 HandlerInterceptor 接口
  • 其實重寫WebMvcConfigurerAdapter中的addInterceptors方法把自定義的攔截器類添加進來即可

首先,自定義攔截器代碼:

public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        boolean flag =true;
        User user=(User)request.getSession().getAttribute("user");
        if(null==user){
            response.sendRedirect("toLogin");
            flag = false;
        }else{
            flag = true;
        }
        return flag;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    }
}

這里我們簡單實現了根據session中是否有User對象來判斷是否登錄,為空就跳轉到登錄頁,不為空就通過。

接着,重寫WebMvcConfigurerAdapter中的addInterceptors方法如下:

/**
* 攔截器
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
    // addPathPatterns 用於添加攔截規則
    // excludePathPatterns 用戶排除攔截
    registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**").excludePathPatterns("/toLogin","/login");
    super.addInterceptors(registry);
}

addPathPatterns("/**")對所有請求都攔截,但是 excludePathPatterns 排除了/toLogin/login請求的攔截。

擴展思考

除了使用session認證方式實現登錄外,還有哪些做法可以實現自動認證登錄?

web開發中還常用cookie來做認證登錄。

參考文獻:

1. https://www.cnblogs.com/java-synchronized/p/7091723.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM