SpringBoot 2.X配置登入攔截器

Null指標發表於2019-01-10

前言

在舊版中,一般繼承 WebMvcConfigurerAdapter類,但由於2.0後,前者已經過時,在spring boot2.x中,WebMvcConfigurerAdapter被deprecated,雖然繼承WebMvcConfigurerAdapter這個類雖然有此便利,但在Spring5.0裡面已經deprecated了。 官方文件也說了,WebMvcConfigurer介面現在已經有了預設的空白方法,所以在Springboot2.0(Spring5.0)下更好的做法還是implements WebMvcConfigurer。

攔截器

目錄

image.png

攔截器

自定義攔截器必須實現HandlerInterceptor,定義一個登入攔截器,攔截需要登入的操作,若未登入則重定向至登入介面

package com.cxy.springboot.utils.Interceptor;

import com.cxy.springboot.utils.GlobalConst;
import com.cxy.springboot.utils.UserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Auther: cxy
 * @Date: 2019/1/10
 * @Description: 攔截器
 */
public class LoginInterceptor implements HandlerInterceptor {
        private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
        @Override
        public boolean preHandle(HttpServletRequest request,
                                 HttpServletResponse response, Object handler) throws Exception {

            UserInfo user = (UserInfo)request.getSession().getAttribute(GlobalConst.USER_SESSION_KEY);
            logger.info(request.getRequestURI().toString());
            if (user == null || user.equals(""))  {
                response.sendRedirect("/login");
                logger.info("請先登入");
                return false;
            }
            return true;
        }

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

        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            logger.info("afterCompletion...");
        }
}
複製程式碼
  1. preHandle:在業務處理器處理請求之前被呼叫。預處理,可以進行編碼、安全控制、許可權校驗等處理;
  2. postHandle:在業務處理器處理請求執行完成後,生成檢視之前執行。後處理(呼叫了Service並返回ModelAndView,但未進行頁面渲染),有機會修改ModelAndView;
  3. afterCompletion:在DispatcherServlet完全處理完請求後被呼叫,可用於清理資源等。返回處理(已經渲染了頁面);

註冊攔截器

新建類 WebConfigurer.java,addPathPatterns 用來設定攔截路徑,excludePathPatterns 用來設定白名單,也就是不需要觸發這個攔截器的路徑。

package com.cxy.springboot.utils;

import com.cxy.springboot.utils.Interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;

/**
 * @Auther: cxy
 * @Date: 2019/1/10
 * @Description: 在web的配置檔案中,例項化登陸的攔截器,並新增規則
 */
@Configuration
public class WebConfigurer implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login").excludePathPatterns("/loginSys").excludePathPatterns("/static/**");
    }
}
複製程式碼

不管哪個版本,addResourceHandler方法是設定訪問路徑字首,addResourceLocations方法設定資源路徑,如果你想指定外部的目錄也很簡單,直接addResourceLocations指定即可,程式碼如下:

registry.addResourceHandler("/static/**").addResourceLocations("file:E:/cxy/");
複製程式碼

配置靜態資源

在application.properties 或 application.yml指定靜態資源攔截,要不然靜態資源會被攔截。

#配置靜態資源
spring.mvc.static-path-pattern=/static/**
複製程式碼

前臺靜態檔案路徑配置

<link th:href="@{/static/js/hplus/css/bootstrap.min14ed.css}" rel="stylesheet">
複製程式碼

相關文章