Spring Boot静态资源访问 拦截器 Thymeleaf模板引擎实现简单登录

魔法使者 2024-05-16 ⋅ 25 阅读

介绍

在Web应用程序中,经常需要实现用户登录功能。本文将使用Spring Boot来演示如何使用静态资源访问、拦截器和Thymeleaf模板引擎来实现一个简单的登录功能。

准备工作

首先,我们需要创建一个基于Spring Boot的Maven项目,并添加以下依赖项:

<dependencies>
    <!-- Spring Boot Web 模块 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    <!-- Thymeleaf 模板引擎 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
</dependencies>

静态资源访问

静态资源文件(如CSS、JavaScript、图片等)通常放在项目的resources/static目录下。Spring Boot默认会将该目录下的静态资源映射到根路径下。

例如,将一个名为style.css的CSS文件放在resources/static/css目录下,可以通过/css/style.css来访问该文件。

登录页面

创建一个名为login.html的Thymeleaf模板文件,并放在resources/templates目录下。以下是一个简单的登录页面的示例代码:

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
    <link rel="stylesheet" th:href="@{/css/style.css}" type="text/css">
</head>
<body>
    <h1>Login</h1>
    <form action="#" method="post">
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username">
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password">
        </div>
        <div>
            <button type="submit">Login</button>
        </div>
    </form>
</body>
</html>

这个页面包含一个表单,用于输入用户名和密码,并通过POST请求将表单数据提交给服务器。

登录拦截器

创建一个名为LoginInterceptor.java的拦截器类,并实现HandlerInterceptor接口。该拦截器用于拦截访问受限资源之前的请求,判断用户是否已经登录。

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        // 检查用户是否已经登录
        if (request.getSession().getAttribute("user") == null) {
            // 如果用户未登录,则重定向到登录页面
            response.sendRedirect("/login");
            return false;
        }

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
    }

}

配置拦截器

创建一个名为WebConfig.java的Spring Boot配置类,并使用@Configuration注解标记。在该类中,注册自定义的拦截器。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册登录拦截器,并指定拦截路径
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/admin/**");
    }
    
}

在上述示例中,我们将拦截路径设置为/admin/**,表示只有以/admin开头的路径需要进行登录验证,其他路径可以匿名访问。

控制器

创建一个名为LoginController.java的控制器类,用于处理登录相关的请求。

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class LoginController {

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

    @PostMapping("/login")
    public String login(HttpServletRequest request, String username, String password) {
        // 在实际应用中,通常需要将用户名和密码与数据库中的记录进行比对,这里只是一个简单示例
        if (username.equals("admin") && password.equals("password")) {
            // 登录成功,将用户信息保存到Session中
            request.getSession().setAttribute("user", username);
            return "redirect:/admin/dashboard";
        } else {
            return "redirect:/login?error";
        }
    }

    @GetMapping("/admin/dashboard")
    public String dashboardPage() {
        return "dashboard";
    }

}

在上述示例中,loginPage方法用于返回登录页面,login方法用于处理登录请求,并将用户信息保存到Session中。当用户登录成功后,会重定向到/admin/dashboard页面。

验证登录状态

为了在登录成功后,页面能够正确显示用户信息,我们可以在模板中添加以下代码来验证登录状态:

<div th:if="${session.user != null}">
    <p>Welcome, <span th:text="${session.user}"></span>!</p>
</div>
<div th:unless="${session.user != null}">
    <p>Please login!</p>
</div>

以上代码会根据Session中是否存在user属性来显示欢迎信息或登录提示。

运行和测试

完成以上步骤后,启动应用程序,并在浏览器中访问http://localhost:8080/login。您将看到一个简单的登录页面。尝试使用用户名admin和密码password进行登录,并观察页面是否正确跳转到了/admin/dashboard页面,并显示了欢迎信息。

总结

本文演示了如何使用Spring Boot实现静态资源访问、拦截器和Thymeleaf模板引擎来实现一个简单的登录功能。这只是个基本示例,实际应用中可能需要更加复杂的权限验证和用户管理。希望本文能为您带来一些帮助,并为您在开发Web应用程序时节省时间和精力。

更多关于Spring Boot的学习资料可以参考官方文档:https://spring.io/projects/spring-boot


全部评论: 0

    我有话说: