文章目录
- SpringBoot中使用拦截器拦截跳转登录详解
- 一、引言
- 二、方法一:基于Session的拦截器
- 1、拦截器实现
- 1.1、创建拦截器类
- 1.2、拦截器配置
- 2、控制器和视图
- 2.1、控制器实现
- 2.2、视图实现
- 三、方法二:基于异常处理的拦截器
- 1、拦截器实现
- 1.1、创建拦截器类
- 1.2、拦截器配置
- 2、异常处理
- 2.1、自定义异常
- 2.2、全局异常处理
- 3、登录实现
- 3.1、控制器登录方法
- 3.2、业务层登录实现
- 四、总结
SpringBoot中使用拦截器拦截跳转登录详解
一、引言
在SpringBoot应用中,权限控制是一个重要的功能,它确保了只有经过身份验证的用户才能访问特定的资源。拦截器(Interceptor)是Spring框架提供的一种机制,用于在请求的生命周期中插入自定义逻辑,如身份验证、日志记录等。本文将详细介绍两种在SpringBoot中使用拦截器来控制用户登录并跳转到指定页面的方法,以及它们的实现细节。
二、方法一:基于Session的拦截器
1、拦截器实现
1.1、创建拦截器类
在SpringBoot中,我们可以通过实现HandlerInterceptor
接口来创建一个拦截器。preHandle
方法是在请求处理之前调用的,如果返回false
,则请求将不会继续执行,这正是我们检查用户是否登录的地方。
@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic 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 {@Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic 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 {@Overridepublic 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 {@Overridepublic 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中使用拦截器拦截跳转登录
- 登录拦截以及拦截后指定页面跳转