您的位置:

SpringBoot登录拦截详解

一、拦截器原理

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