SpringBoot十五:攔截器實現

登錄

開發期間模板引擎頁面修改以後,要實時生效

  1. 禁用模板引擎的緩存 spring.thymeleaf.cache=false
  2. 頁面修改完成以後,ctrl+f9:重新編譯
  3. 登錄錯誤消息顯示 th:text="${msg}" th:if="${not #string.isEmpty(msg)}"
  4. 登錄成功,表單防止重複提交,重定向到組件,然後用組件轉發

 

攔截器

注意:攔截器說明,在SpringBoot1.5x時,靜態資源在static目錄下,訪問路徑不需要帶/static,而且攔截器不會對靜態資源攔截;但是SpringBoot2.0x以上時,靜態資源會被攔截,並且訪問路徑需要帶上/static,當然攔截器也要放行靜態資源;

1、編寫攔截器類LoginHandlerInterceptor實現HandlerInterceptor

package com.xue.springbootweb.component;

import org.aopalliance.intercept.Interceptor;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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

/**
 * @Description
 * 登錄攔截
 * @Author xuexue
 * @Date 2019/10/14 20:29
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {

    //登錄之前進行攔截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //獲得session
        Object status = request.getSession().getAttribute("status");
        if (status == null) {
            //向頁面添加錯誤信息
            request.setAttribute("msg", "沒有權限訪問");
            //轉發到登錄頁面
            request.getRequestDispatcher("/login").forward(request, response);
            return false;
        }

        //放行
        return true;
    }

    @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 {

    }
}

 

2、註冊攔截器(放行登錄頁面與登錄處理頁面)

  • MyMvcConfig實現WebMvcConfigurer
  • 重寫addInterceptors方法註冊

代碼如下:

package com.xue.springbootweb.config;

import com.xue.springbootweb.component.LoginHandlerInterceptor;
import com.xue.springbootweb.component.MyLocaleResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

/**
 * @Description
 * 擴展SpringMVC功能
 * @Author xuexue
 * @Date 2019/10/14 9:16
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    /**
     * 頁面控制
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //跳轉至登錄頁面
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");

        //做重定向到登錄處理
        registry.addViewController("/main").setViewName("index.html");
    }

    /**
     * 註冊攔截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //登錄頁面、登錄處理頁面不能攔截
        registry.addInterceptor(new LoginHandlerInterceptor()).
                addPathPatterns("/**").
                excludePathPatterns("/login", "/login.html", "/user/login");
    }
}

 

如果SpringBoot在2.0x版本以上則需要放行/static/**

    /**
     * 登錄攔截器
     *
     * @param registry
     */
    public void addInterceptors(InterceptorRegistry registry) {
        String[] excludes = new String[]{"/login", "/login.html", "/user/login", "/static/**"};
        registry.addInterceptor(new MyInterceptor()).
                addPathPatterns("/**").
                excludePathPatterns(excludes);
    }

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章