当我们写一个web项目,都需要配置一个拦截器,这样就可以只有登录后才能访问其它页面。在之前学习的Spring中拦截器可以在XML文件中进行配置,而在SpringBoot中我们可以手动实现拦截器功能。
首先我们需要实现一个登录功能。
这里是一个简单的登录页面,可将用户名和密码发给后端。
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.w3.org/1999/xhtml">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form th:action="@{/user/login}" method="post">
<input type="text" name="username"> 登录1 <br>
<input type="password" name="password"> 密码 <br>
<P style="color: red" th:text="${msg}" ></P>
<button>登录</button>
</form>
</body>
</html>
后端登录的简单实现
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpSession;
@Controller
public class LoginController {
@RequestMapping("/user/login")
public String login(String username, String password, Model model, HttpSession session){
// return username+"---"+password;
if(!StringUtils.isEmpty(username) && "asd".equals(password)){ //当账号不是空且密码为“asd” 表示登录成功
session.setAttribute("User",username);
return "test";
}else{
model.addAttribute("msg","用户名或密码错误!");
return "index";
}
}
}
登录成功会跳转到test页面,如果没有拦截器,我们就可以直接在网址上访问test页面无需登录,显然这会存在一些安全问题。
拦截器的实现
登录成功后会在session中存入该用户对象,然后在其它页面先进行session的验证来判断是否登录。
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LoginHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object o = request.getSession().getAttribute("User");
if(o == null){
request.setAttribute("msg","没有权限");
request.getRequestDispatcher("/").forward(request,response);
return false;
}
return true;
}
}
注册拦截器
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
//如果扩展SpringMVC 官方建议这样操作
@Configuration
//@EnableWebMvc //导入一个类 自动装配失效
public class MyMvcConfig_2 implements WebMvcConfigurer {
//视图跳转
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
}
//配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginHandlerInterceptor()).addPathPatterns("/**")
.excludePathPatterns("/index.html","/","/user/login"); //不被拦截的请求
}
}
测试:直接访问test页面,会被拦截到然后返回到登录页面并进行提示。