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