SpringBoot中使用拦截器拦截跳转登录的两种实现方法
一、引言
在SpringBoot应用中,权限控制是一个重要的功能,它确保了只有经过身份验证的用户才能访问特定的资源。拦截器(Interceptor)是Spring框架提供的一种机制,用于在请求的生命周期中插入自定义逻辑,如身份验证、日志记录等。本文将详细介绍两种在SpringBoot中使用拦截器来控制用户登录并跳转到指定页面的方法,以及它们的实现细节。
二、方法一:基于Session的拦截器
1、拦截器实现
1.1、创建拦截器类
在SpringBoot中,我们可以通过实现HandlerInterceptor接口来创建一个拦截器。preHandle方法是在请求处理之前调用的,如果返回false,则请求将不会继续执行,这正是我们检查用户是否登录的地方。
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException, IOException {
User user = (User) request.getSession().getAttribute("user");
if(user == null){
request.setAttribute("msg","没有权限");
request.getRequestDispatcher("/index").forward(request,response);
return false;
}else {
return true;
}
}
}
1.2、拦截器配置
接下来,我们需要在WebMvcConfigurer的实现类中注册我们的拦截器,并指定拦截路径和排除路径。
@Configuration
public class WebConfigurer implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/index","/login");
}
}
2、控制器和视图
2.1、控制器实现
控制器A01Controller负责处理登录请求,并根据验证结果重定向到不同的页面。
@Controller
public class A01Controller {
@RequestMapping("/index")
public String test1(){
return "amodule/A01";
}
@PostMapping(value = "/login")
public String test2(@RequestParam("username") String username,
@RequestParam("password") String password,
HttpSession session,
Map map){
if("123".equals(username) && "123".equals(password)){
User user = new User();
user.setUser_name(username);
user.setPassword(password);
session.setAttribute("user",user);
return "redirect:/main.html";
}else {
map.put("msg","账号或密码错误,请重新登录");
return "amodule/A01";
}
}
}
2.2、视图实现
JSP页面A01.jsp作为登录页面,用户在这里输入用户名和密码。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<html>
<head>
<title>Title</title>
<!-- 省略CSS和JS引用 -->
</head>
<body>
<!-- 登录表单 -->
<form style="margin-left:500px;margin-top:200px;" action="${pageContext.request.contextPath}/login" method="POST" id="formBtn">
<p style="color: red;">${msg}</p>
<div class="form-group">
<label for="user" stype="display:inline;">账户:</label>
<input type="text" class="form-control" name="username" id="user" style="display:inline;width:200px;"autocomplete="off" />
</div>
<div class="form-group">
<label for="password" style="display:inline;">密码:</label>
<input type="text" class="form-control" name="password" id="password" style="display:inline;width:200px;"autocomplete="off" />
</div>
<button type="submit" class="btn btn-primary">登录</button>
</form>
</body>
</html>
三、方法二:基于异常处理的拦截器
1、拦截器实现
1.1、创建拦截器类
在第二种方法中,我们同样创建一个拦截器类MyInterceptor,但这次我们在用户未登录时抛出一个自定义异常。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object user = session.getAttribute("user");
if (null == user) {
throw new LogOutException("用户未登录");
}
return true;
}
}
1.2、拦截器配置
在LoginConfig类中注册拦截器,并设置拦截和排除路径。
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
InterceptorRegistration registration = registry.addInterceptor(new MyInterceptor());
registration.addPathPatterns("/**");
registration.excludePathPatterns("/doLoginUI", "/user/doLogin", "/bower_components/**", "/modules/**", "/plugins/**", "/dist/**");
}
}
2、异常处理
2.1、自定义异常
创建一个自定义异常LogOutException,用于在用户未登录时抛出。
public class LogOutException extends Exception {
public LogOutException() {
super();
}
public LogOutException(String message) {
super(message);
}
}
2.2、全局异常处理
创建一个全局异常处理类GlobalExceptionHandler,用于捕获并处理拦截器抛出的异常。
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(LogOutException.class)
public String doLogOutException(LogOutException e) {
return "redirect:/doLoginUI";
}
}
3、登录实现
3.1、控制器登录方法
在控制器中实现登录逻辑,并在成功登录后将用户信息存储到Session中。
@RequestMapping("/doLogin")
public JsonResult doLogin(String username, String password, HttpServletRequest request) throws Exception {
sysUserService.doLogin(username, password);
SysUser user = new SysUser();
user.setPassword(password);
user.setUsername(username);
HttpSession session = request.getSession();
session.setAttribute("user", user);
return new JsonResult("登陆成功");
}
3.2、业务层登录实现
在业务层实现登录逻辑,包括密码的加密和验证。
@Override
public Boolean doLogin(String username, String password) throws Exception {
SysUser user = sysUserDao.select(username);
if (null == user) {
throw new UnknownAccountException("用户名不存在");
}
SimpleHash sh = new SimpleHash("MD5", password, user.getSalt(), 1);
String hashedPassword = sh.toHex();
if (!user.getPassword().equals(hashedPassword)) {
throw new Exception("密码错误");
}
return true;
}
四、总结
本文详细介绍了两种在SpringBoot中使用拦截器来控制用户登录并跳转到指定页面的方法。第一种方法是基于Session的检查,适用于大多数需要简单权限控制的场景。第二种方法是基于异常处理,它提供了更灵活的错误处理机制,适用于需要精细控制用户访问权限的复杂应用。两种方法各有优势,开发者可以根据实际需求选择适合的实现方式。
以上就是SpringBoot中使用拦截器拦截跳转登录的两种实现方法的详细内容,更多关于SpringBoot拦截器拦截跳转登录的资料请关注脚本之家其它相关文章!
相关文章
springboot手动动态注入controller和service方式
这篇文章主要介绍了springboot手动动态注入controller和service方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-03-03
SpringBoot集成WebSocket实现后台向前端推送信息
在一次项目开发中,使用到了Netty网络应用框架,以及MQTT进行消息数据的收发,这其中需要后台来将获取到的消息主动推送给前端,所以本文记录了SpringBoot集成WebSocket实现后台向前端推送信息的操作,需要的朋友可以参考下2024-02-02
IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目
这篇文章主要介绍了IntelliJ IDEA下SpringBoot如何指定某一个配置文件启动项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-09-09


最新评论