我来为您详细讲解“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.password
和security.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.html
和login.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.html
和login.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技术站