一、引言
在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拦截器拦截跳转登录的资料请关注代码网其它相关文章!
发表评论