1. 程式人生 > >SpringBoot攔截器

SpringBoot攔截器

一、登入時可能會出現重複提交問題。我們可以通過重定向解決此問題。例如:使用者提交的請求為:/user/login,通過redirect:重定向至main.html請求。

    @PostMapping("/user/login")
    public String login(@RequestParam("username") String name,
                        @RequestParam("password") String password,
                        Map<String,String> map,
                        HttpSession session){
        if(!StringUtils.isEmpty(name) && password.equals("123456")){
            //將使用者名稱設定到session中
            session.setAttribute("loginUser",name);
            return "redirect:/main.html";
        }else{
            map.put("msg","密碼或使用者名稱錯誤");
            return "index";
        }
    }

二、配置檢視對映,新建一配置類通過繼承WebMvcConfigurerAdapter類,實現addViewControllers方法,新增檢視對映。WebMvcConfigurerAdapter該抽象類其實裡面沒有任何的方法實現,只是空實現了介面WebMvcConfigurer內的全部方法,並沒有給出任何的業務邏輯處理,這一點設計恰到好處的讓我們不必去實現那些我們不用的方法,都交由WebMvcConfigurerAdapter抽象類空實現,如果我們需要針對具體的某一個方法做出邏輯處理,僅僅需要在WebMvcConfigurerAdapter子類中@Override對應方法就可以了。

@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
        registry.addViewController("/index.html").setViewName("index");
        registry.addViewController("/main.html").setViewName("dashboard");
    }
}

三、新增自己配置的攔截器:因為當我們訪問:/main.html請求的時候,也可以跳轉至dashboard.html頁面,需要實現HandlerInterceptor介面。通過preHandle判斷是否登入成功。preHandle:在業務處理器處理請求之前被呼叫。預處理,可以進行編碼、安全控制、許可權校驗等處理;

public class LoginHandlerInterceptor implements HandlerInterceptor{
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        Object user = httpServletRequest.getSession().getAttribute("loginUser");
        if(user == null){
            httpServletRequest.setAttribute("msg","沒有許可權請先登入");
            httpServletRequest.getRequestDispatcher("/index.html").forward(httpServletRequest,httpServletResponse);
            return false;
        }else{
            //已登入,放行。
            return true;
        }
    }

    ////postHandle:在業務處理器處理請求執行完成後,生成檢視之前執行。後處理(呼叫了Service並返 回ModelAndView,但未進行頁面渲染),有機會修改ModelAndView (這個博主就基本不怎麼用了);
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    //afterCompletion:在DispatcherServlet完全處理完請求後被呼叫,可用於清理資源等。返回處理(已經渲染了頁面);    
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

四、需要將自己定義的攔截器註冊到IOC容器中,進入我們自定義的配置類MyMvcConfig。需要注意的是登入請求/user/login不要忘記排除掉。

@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //super.addInterceptors(registry);
        //SpringBoot已經做好了靜態資源對映
        registry.addInterceptor(new LoginHandlerInterceptor()).
                addPathPatterns("/**").excludePathPatterns("/index.html","/","/user/login");
    }
}