SpringBoot登录拦截配置详解(实测可用)

我来为您详细讲解“SpringBoot登录拦截配置详解(实测可用)”的完整攻略。

1. 概述

SpringBoot是一款广受欢迎的Java Web框架,它为用户提供了便利的开发方式和高效的运行效率。在开发Web应用中,安全问题一直都是我们需要重视的问题。为了保护Web应用的安全,我们可以通过登录拦截的方式进行控制。本文将带大家详细讲解SpringBoot的登录拦截配置。

2. 登录拦截的实现步骤

2.1 添加依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2.2 创建登录控制器

创建一个登录控制器,实现用户登录的功能。在登录的方法中,可以通过判断用户名和密码是否正确来判断用户是否登录成功。如果登录成功,就将用户信息保存在会话中,然后重定向到主页面。

@Controller
public class LoginController {

    @RequestMapping(value = "/login", method = RequestMethod.GET)
    public String login() {
        return "login";
    }

    @RequestMapping(value = "/doLogin", method = RequestMethod.POST)
    public String doLogin(String username, String password, HttpSession session, Model model) {
        if ("admin".equals(username) && "admin".equals(password)) {
            session.setAttribute("user", username);
            return "redirect:/index";
        } else {
            model.addAttribute("msg", "用户名或密码错误!");
            return "login";
        }
    }

    @RequestMapping(value = "/logout", method = RequestMethod.GET)
    public String logout(HttpSession session) {
        session.removeAttribute("user");
        return "redirect:/login";
    }

}

2.3 配置登录拦截

在application.properties文件中添加以下配置:

# 允许所有用户访问的URL
security.ignored=/**/favicon.ico,/css/**,/js/**,/images/**
# 设定已经拥有 "USER" 权限的用户能够访问的URL
security.user.password=password
security.user.name=admin

上述配置中,security.ignored参数指定了那些URL可以不被拦截,这些URL不需要进行登录认证。security.user.passwordsecurity.user.name参数指定了一个默认的登录用户。

在启动类中添加@EnableWebSecurity注解,并实现WebSecurityConfigurerAdapter类,重写configure方法。在这个方法中,可以配置登录拦截的相关信息。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/login", "/doLogin").permitAll() // 允许用户匿名登录访问
                .anyRequest().authenticated() // 其他页面都需要登录才能访问
                .and().formLogin().loginPage("/login")
                .defaultSuccessUrl("/index").permitAll() // 登录成功后跳转到index.html
                .and().logout().permitAll(); // 退出登录允许任何用户访问
    }

}

上述配置中,.antMatchers("/login", "/doLogin").permitAll()表示访问/login/doLogin这两个URL可以被所有用户访问,不需要登录验证。.anyRequest().authenticated()表示其他的URL都必须要进行登录验证才能访问。.formLogin().loginPage("/login").defaultSuccessUrl("/index").permitAll()表示通过表单的方式进行登录,登录页面的地址是/login,登录成功后跳转到/index页面。.logout().permitAll()表示允许任何用户访问注销URL。

2.4 添加拦截器

在SpringBoot项目中,我们还可以通过添加拦截器的方式来实现登录拦截。以下是添加拦截器的实现步骤:

2.4.1 编写拦截器

创建一个拦截器类,实现HandlerInterceptor接口并重写其中的方法。

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        // 判断用户是否已经登录
        if (session.getAttribute("user") != null) {
            return true;
        }
        // 如果用户没有登录,重定向到登录页面
        response.sendRedirect("/login");
        return false;
    }

}

在上述拦截器中,preHandle方法中先判断用户是否已经登录,如果已经登录,则返回true,允许访问。如果没有登录,则重定向到登录页面。

2.4.2 注册拦截器

在WebMvcConfigurer中注册拦截器。

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**") // 拦截所有URL
                .excludePathPatterns("/login", "/doLogin"); // 排除的URL
    }

}

在上述代码中,addInterceptors方法中注册了一个拦截器,并使用.addPathPatterns("/**")指定了需要拦截的URL,使用.excludePathPatterns("/login", "/doLogin")排除了一些不需要拦截的URL。

3. 示例

3.1 拦截器登录示例

以下是一个通过拦截器的方式来实现登录拦截的示例。

3.1.1 创建SpringBoot项目

3.1.2 添加依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.5.5</version>
</dependency>

3.1.3 编写页面

src/main/resources/templates下创建index.htmllogin.html两个页面。

index.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>SpringBoot 拦截器登录示例</title>
</head>
<body>
<h1>欢迎来到我的应用!</h1>
</body>
</html>

login.html:

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>SpringBoot 拦截器登录示例</title>
</head>
<body>
<h1>登录</h1>
<form method="post" action="/doLogin">
    <p><input type="text" name="username" placeholder="请输入用户名"></p>
    <p><input type="password" name="password" placeholder="请输入密码"></p>
    <p><input type="submit" value="登录"></p>
</form>
</body>
</html>

3.1.4 编写Controller

@Controller
public class LoginController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @RequestMapping("/login")
    public String login() {
        return "login";
    }

    @RequestMapping(value = "/doLogin", method = RequestMethod.POST)
    public String doLogin(String username, String password, HttpSession session, Model model) {
        if ("admin".equals(username) && "admin".equals(password)) {
            session.setAttribute("user", username);
            return "redirect:/"; // 登录成功后跳转到主页
        } else {
            model.addAttribute("msg", "用户名或密码错误!");
            return "login";
        }
    }

    @RequestMapping("/logout")
    public String logout(HttpSession session) {
        session.removeAttribute("user");
        return "redirect:/login";
    }

}

3.1.5 编写拦截器

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        HttpSession session = request.getSession();
        // 判断用户是否已经登录
        if (session.getAttribute("user") != null) {
            return true;
        }
        // 如果用户没有登录,重定向到登录页面
        response.sendRedirect("/login");
        return false;
    }

}

3.1.6 注册拦截器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器
        registry.addInterceptor(loginInterceptor)
                .addPathPatterns("/**") // 拦截所有URL
                .excludePathPatterns("/login", "/", "/doLogin"); // 排除的URL
    }

}

访问http://localhost:8080/,会被拦截器重定向到http://localhost:8080/login登录页面,输入正确的用户名和密码,会被重定向回主页面。

3.2 SpringSecurity登录示例

以下是一个通过SpringSecurity的方式来实现登录拦截的示例。

3.2.1 创建SpringBoot项目

3.2.2 添加依赖

在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.5.5</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>2.5.5</version>
</dependency>

3.2.3 编写页面

src/main/resources/templates下创建index.htmllogin.html两个页面。

index.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>SpringBoot SpringSecurity登录示例</title>
</head>
<body>
<h1>欢迎来到我的应用!</h1>
</body>
</html>

login.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>SpringBoot SpringSecurity登录示例</title>
</head>
<body>
<h1>登录</h1>
<form th:action="@{/doLogin}" method="post">
    <p><input type="text" name="username" placeholder="请输入用户名"></p>
    <p><input type="password" name="password" placeholder="请输入密码"></p>
    <p><input type="submit" value="登录"></p>
</form>
<div th:text="${msg}"></div>
</body>
</html>

3.2.4 编写Controller

@Controller
public class LoginController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @RequestMapping("/login")
    public String login() {
        return "login";
    }

    @RequestMapping("/logout")
    public String logout() {
        return "login";
    }

}

3.2.5 添加配置类

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/css/**", "/js/**").permitAll() // 允许访问静态资源
                .anyRequest().authenticated() // 其他请求需要认证
                .and()
                .formLogin() // 使用表单进行登录
                .loginPage("/login") // 登录页面
                .usernameParameter("username") // Set the parameter name which will be used for the username.
                .passwordParameter("password") // Set the parameter name which will be used for the password.
                .defaultSuccessUrl("/")
                .permitAll() // 允许使用者进入主页
                .and()
                .logout()
                .permitAll(); // 允许所有用户访问注销URL
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .passwordEncoder(new BCryptPasswordEncoder())
                .withUser("admin")
                .password(new BCryptPasswordEncoder().encode("admin"))
                .roles("ADMIN");
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }

}

在上述配置代码中,.formLogin()表示通过表单登录验证,.loginPage("/login")表示登录页面地址为/login.defaultSuccessUrl("/")表示登录成功后跳转到主页,.logout()表示配置注销登录的相关信息。

.antMatchers("/css/**", "/js/**").permitAll()表示允许访问静态资源。.anyRequest().authenticated()表示其他请求需要完成身份验证。

configure(AuthenticationManagerBuilder auth)方法中,通过inMemoryAuthentication()方法在内存中创建了一个管理员账户,设置了账户名和密码,以及角色。

3.2.6 启动应用

在启动应用后,访问http://localhost:8080/会被转到http://localhost:8080/login登录页面。输入账户名和密码,正确登录后会被转到主页面。注销后会回到登录页面。

4. 总结

本文详细讲解了SpringBoot的登录拦截配置,同时提供了两个示例:通过拦截器和通过SpringSecurity的方式来实现登录拦截。希望本文对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot登录拦截配置详解(实测可用) - Python技术站

(0)
上一篇 2023年5月15日
下一篇 2023年5月15日

相关文章

  • 类加载的生命周期包括哪些阶段?

    以下是关于类加载的生命周期包括哪些阶段的详细讲解: 类加载的生命周期包括哪些阶段? 类加载的生命周期包括以下几个阶段: 加载(Loading):将类的字码加载到内存中。 链接(Linking):将类的二进制数据合并到 Java 运行时环境中。 验证(Verification):验证的字节码是否符合 Java 虚拟机规范。 准备(Preparation):为类…

    Java 2023年5月12日
    00
  • Ajax技术(WEB无刷新提交数据)-

    Ajax技术 什么是Ajax? Ajax全称为Asynchronous JavaScript And XML(异步JavaScript和XML),是一种用于创建快速动态网页的技术。 使用Ajax技术,网页可以实现异步加载和提交数据,无需刷新整个页面,提高了用户体验,减轻了服务器的负担。 Ajax的基本原理 Ajax通过在后台与服务器进行少量数据交换,实现无刷…

    Java 2023年5月23日
    00
  • 在无界面centos7上部署jdk和tomcat的教程

    在无界面CentOS 7上部署JDK和Tomcat教程 在无界面CentOS 7上部署JDK和Tomcat可以提供Web应用程序的基本运行环境,在本文中将介绍完整的部署过程。 安装Java JDK 从Oracle官网下载适用于Linux的JDK安装包(.tar.gz格式)。您可以将其下载到任何地方,我们将假设您将其下载到名为/usr/local的根目录下。以…

    Java 2023年5月19日
    00
  • java反射方式创建代码详解

    让我来为您详细讲解“Java反射方式创建代码详解”的完整攻略。 什么是Java反射 Java反射是指在程序运行时动态地获取类的信息以及动态调用类的方法的机制。Java反射机制提供了在运行时检查和修改类、方法和属性的能力。 Java反射方式创建代码详解 在Java中,我们可以使用反射机制来创建新的类实例、触发方法调用、获取类的属性等。下面将介绍利用反射机制来创…

    Java 2023年5月30日
    00
  • Spring Security之默认的过滤器链及自定义Filter操作

    Spring Security 是 Spring 框架中提供的安全管理框架,它是基于 Servlet 过滤器实现的。 默认的过滤器链 Spring Security 在初始化时会自动生成一整套默认的过滤器链,这些过滤器链是按顺序有序地执行的。因为每个过滤器链都有特定的功能和处理逻辑,对于一个用户的请求,在整个过滤器链中会按照顺序经过每一个过滤器链的处理。最终…

    Java 2023年5月20日
    00
  • Java实现房屋出租系统详解

    Java实现房屋出租系统详解 系统背景 房屋出租系统是一个关注于在线房屋租赁的平台,使得房东可以上传房屋信息,而租客可以浏览平台上的房源,选择心仪房屋进行租赁。 系统功能 该系统主要包含了以下几个功能模块: 房东和租客注册登录:用户需要注册并登录才能使用平台功能。 房源信息管理:房东可以添加、修改和删除房源信息,租客可以查询房源信息。 订单管理:租客可以下单…

    Java 2023年5月24日
    00
  • springboot 使用clickhouse实时大数据分析引擎(使用方式)

    使用ClickHouse实现大数据分析是一个常见的需求,Spring Boot提供了非常便利的方式来集成ClickHouse分析引擎。以下是使用Spring Boot集成ClickHouse的步骤: 1.添加ClickHouse的依赖 在Spring Boot的项目中添加ClickHouse Driver的依赖,可以通过以下的方式添加到项目的pom.xml文…

    Java 2023年5月20日
    00
  • SQL Server 2008 连接JDBC详细图文教程

    SQL Server 2008 连接JDBC详细图文教程 1. 下载驱动程序 在连接 SQL Server 2008 数据库之前,需要先下载并安装相应的 JDBC 驱动程序。可通过以下步骤下载: 进入 Microsoft 官网下载页面; 选择适用于 Java 的 Microsoft JDBC 驱动器版本; 点击“下载”按钮开始下载。 2. 安装驱动程序 下载…

    Java 2023年6月16日
    00
合作推广
合作推广
分享本页
返回顶部