優質博文:IT-BLOG-CN
一、登錄時可能會出現重復提交問題。我們可以通過重定向解決此問題。例如:用戶提交的請求為:/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 {@Overridepublic 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{@Overridepublic 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 (這個博主就基本不怎么用了);@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {}//afterCompletion:在DispatcherServlet完全處理完請求后被調用,可用于清理資源等。返回處理(已經渲染了頁面); @Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {}
}
四、需要將自己定義的攔截器注冊到IOC容器中,進入我們自定義的配置類MyMvcConfig。需要注意的是登錄請求/user/login不要忘記排除掉。
@Configuration
public class MyMvcConfig extends WebMvcConfigurerAdapter {@Overridepublic void addInterceptors(InterceptorRegistry registry) {//super.addInterceptors(registry);//SpringBoot已經做好了靜態資源映射registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**").excludePathPatterns("/index.html","/","/user/login");}
}