一、拦截器原理
Spring Boot的拦截器是基于Java的反射机制实现的,我们可以通过实现HandlerInterceptor接口来定义一个拦截器。在拦截器中,我们可以在请求前后、异常发生及请求完成后执行不同的操作。最常见的操作是在请求前拦截用户是否已经登录,如果没有则跳转到登录界面。
二、实现拦截器
下面是一个简单的登录拦截器,在用户未登录时跳转到登录页面,否则继续访问资源。
public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); Object user = session.getAttribute("user"); if (user == null) { response.sendRedirect("/login"); //跳转到登录页 return false; } return true; } }
三、注册拦截器
在Spring Boot中,我们需要通过配置类来将拦截器注册到应用中:
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login", "/register"); } }
在这个例子中,我们将LoginInterceptor注册为拦截所有请求的拦截器,但是排除了"/login"和"/register"两个路径,因为在这两个路径下用户还没有登录。
四、使用Spring Security
在实际项目中,我们通常使用Spring Security框架来实现登录拦截和权限控制。Spring Security是一个非常强大的安全框架,可以轻松地实现常见的登录、注册、权限控制等功能。
下面是一个简单的Spring Security配置代码:
@Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserService userService; @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder()); } @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/register", "/login", "/error").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .defaultSuccessURL("/index") .permitAll() .and() .logout() .invalidateHttpSession(true) .deleteCookies("JSESSIONID") .permitAll(); } }
在这个例子中,我们定义了两个URL让未登录用户可以访问,其余URL需要通过身份验证后才能访问。登录页面是"/login",默认成功跳转页面是"/index",注销时将清空Session并删除JSESSIONID Cookie。
五、结语
通过本文的阐述,我们了解了Spring Boot的拦截器原理,以及如何使用拦截器实现登录拦截。同时,我们也介绍了使用Spring Security实现登录拦截和权限控制。在实际项目中,我们可以根据实际需求来选择不同的实现方案。