SpringBoot中使用拦截器拦截跳转登录的两种实现方法

 更新时间:2024年11月13日 10:42:51   作者:eqa11  
拦截器(Interceptor)是Spring框架提供的一种机制,用于在请求的生命周期中插入自定义逻辑,如身份验证、日志记录等,本文将详细介绍两种在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拦截器拦截跳转登录的资料请关注脚本之家其它相关文章!

相关文章

最新评论