当前位置: 代码网 > it编程>编程语言>Java > SpringBoot中使用拦截器拦截跳转登录的两种实现方法

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

2024年11月14日 Java 我要评论
一、引言在springboot应用中,权限控制是一个重要的功能,它确保了只有经过身份验证的用户才能访问特定的资源。拦截器(interceptor)是spring框架提供的一种机制,用于在请求的生命周期

一、引言

在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拦截器拦截跳转登录的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com