一、拦截器原理
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实现登录拦截和权限控制。在实际项目中,我们可以根据实际需求来选择不同的实现方案。