以下是實現未登錄不能進入頁面的實現
使用了thyemeleaf+SpringBoot+過濾器實現的,過濾器的核心代碼如下:
@Component @WebFilter(filterName = "TestFilter",urlPatterns = "/*") @Order(1) //Order(1)在定義多個Filter時,用於決定執行順序的,數字越小,越先執行。 public class TestFilter implements Filter { private static final Set<String> ALLOWED_PATHS = Collections.unmodifiableSet(new HashSet<>( Arrays.asList("/index", "/login"))); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // //這樣在每個Servlet執行的時候都會先進行這個 HttpServletRequest request= (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; System.out.println("過濾器實現"); if(needLogin(request)) { // 需要登錄則跳轉到登錄Controller String userName = (String)((HttpServletRequest) request).getSession().getAttribute("userName"); System.out.println("userName="+userName); System.out.println(Optional.ofNullable(userName).map(String::length).orElse(0)); if(Optional.ofNullable(userName).map(String::length).orElse(0) <= 0){ response.sendRedirect("login"); // response.sendRedirect(request.getContextPath()+"/login"); } filterChain.doFilter(servletRequest, servletResponse); return; }else{ } //因為有可能不止這一個過濾器,所以需要將所有的過濾器執行 //注意 這一行代碼一定要寫到最后 filterChain.doFilter(servletRequest, servletResponse); } @Override public void destroy() { } private boolean needLogin(HttpServletRequest request) { //進行是否需要登錄的判斷操作 String path = request.getRequestURI().substring(request.getContextPath().length()).replaceAll("[/]+$", ""); System.out.println(path); boolean allowedPath = ALLOWED_PATHS.contains(path); System.out.println(allowedPath); return !allowedPath; } }
代碼鏈接:
鏈接:https://pan.baidu.com/s/1Kvh4JWCM3aIpiaqK67Rw3g 密碼:pa57
過濾器雖然也能實現,但是用起來會有個問題,假如說是我請求http://localhost:8080/usercenter,時,我期望的過程是,在過濾器里發現未登錄,直接就跳轉進入login,但是,實際山遇到的情況是,會先進入我的usercenter方法,跑過這個方法之后再進過濾器,再走login,這就會出現情況,假如說是我的usercenter方法(由於未登錄導致出現方法中出現null的情況)有問題,導致最后頁面報500
,為了解決這個問題,采用了攔截器,正好就是自己想要的效果,未登錄的時候不進入usercenter,直接進入login
一下是攔截器代碼:
攔截器的:
@Configuration public class LoginInterceptor implements HandlerInterceptor { @Override // 在執行目標方法之前執行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("------:進來攔截器了!--1"); //獲取session HttpSession session = request.getSession(true); //判斷用戶ID是否存在,不存在就跳轉到登錄界面 if(session.getAttribute("phoneNum") == null){ System.out.println("------:跳轉到login頁面!"); response.sendRedirect(request.getContextPath()+"/login"); return false; }else{ session.setAttribute("phoneNum", session.getAttribute("phoneNum")); return true; } } @Override // 執行目標方法之后執行 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("------:進來攔截器了!--2"); } @Override // 在請求已經返回之后執行 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("------:進來攔截器了!--3"); } }
配置文件的:WebConfig.java的代碼:
@Configuration @EnableWebMvc @ComponentScan public class WebConfig extends WebMvcConfigurerAdapter implements ApplicationContextAware { private ApplicationContext applicationContext; public WebConfig(){ super(); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/"); registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/"); super.addResourceHandlers(registry); } @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext; } @Override public void addInterceptors(InterceptorRegistry registry) { //攔截規則:除了login,其他都攔截判斷 registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/index", "/login","register"); super.addInterceptors(registry); } }
這樣就能完美的解決過濾器時遇到的問題
結束
代碼鏈接:鏈接:https://pan.baidu.com/s/1QusjeJ2EVo4K55xN_saooQ 密碼:nh85
