SpringBoot攔截器
阿新 • • 發佈:2019-01-06
一、登入時可能會出現重複提交問題。我們可以通過重定向解決此問題。例如:使用者提交的請求為:/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");
}
}