Directorio de artículos
Para los sistemas de gestión u otros sistemas que requieren el inicio de sesión de usuario, la verificación de inicio de sesión es un enlace indispensable En el proyecto desarrollado por SpringBoot, la interceptación y verificación de inicio de sesión de usuario se logra mediante la implementación de interceptores.
1. El principio de la implementación de SpringBoot de la intercepción de inicio de sesión
SpringBoot HandlerInterceptor
implementa el interceptor implementando la WebMvcConfigurer
interfaz, implementa una clase de configuración implementando la interfaz, inyecta el interceptor en la clase de configuración y finalmente inyecta la configuración a través de la anotación @Configuration.
1.1, implementar la HandlerInterceptor
interfaz
Implementar HandlerInterceptor
la interfaz necesidad de implementar tres preHandle
métodos: postHandle
,, afterCompletion
.
Las funciones de cada uno de los tres métodos son las siguientes:
package blog.interceptor;
import blog.entity.User;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class UserLoginInterceptor implements HandlerInterceptor {
/***
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行了拦截器的preHandle方法");
try {
HttpSession session = request.getSession();
//统一拦截(查询当前session是否存在user)(这里user会在每次登录成功后,写入session)
User user = (User) session.getAttribute("user");
if (user != null) {
return true;
}
response.sendRedirect(request.getContextPath() + "login");
} catch (Exception e) {
e.printStackTrace();
}
return false;
//如果设置为false时,被请求时,拦截器执行到此处将不会继续操作
//如果设置为true时,请求将会继续执行后面的操作
}
/***
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行了拦截器的postHandle方法");
}
/***
* 整个请求结束之后被调用,也就是在DispatchServlet渲染了对应的视图之后执行(主要用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("执行了拦截器的afterCompletion方法");
}
}
preHandle
Se ejecuta antes que el Controlador, por lo que la función del interceptor se implementa principalmente en esta parte:
- Compruebe si hay un
user
objeto en la sesión ; - Si existe, regrese
true
y luego el Controlador continuará la operación posterior; - Si no existe, será redirigido a la interfaz de inicio de sesión, a
través de este interceptor se ejecutará el Controlador antes de ejecutarlopreHandle
.
1.2. Implementar la WebMvcConfigurer
interfaz y registrar el interceptor
Implemente la WebMvcConfigurer
interfaz para implementar una clase de configuración y registre un objeto del interceptor implementado anteriormente en esta clase de configuración.
package blog.config;
import blog.interceptor.UserLoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class LoginConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册TestInterceptor拦截器
InterceptorRegistration registration = registry.addInterceptor(new UserLoginInterceptor());
registration.addPathPatterns("/**"); //所有路径都被拦截
registration.excludePathPatterns( //添加不拦截路径
"/login", //登录路径
"/**/*.html", //html静态资源
"/**/*.js", //js静态资源
"/**/*.css" //css静态资源
);
}
}
Registre el interceptor en la lista de interceptores y especifique qué rutas de acceso están bloqueadas, qué rutas de acceso no están bloqueadas y qué archivos de recursos no están bloqueados; finalmente, la configuración se inyecta con la anotación @Configuration.
1.3, mantén la sesión iniciada
Solo necesita iniciar sesión una vez. Si ha iniciado sesión, no es necesario que vuelva a iniciar sesión la próxima vez que lo visite, puede acceder directamente al contenido del sitio web.
Después del inicio de sesión correcto, se user
guardará session
. Cuando se vuelva a acceder a la página, el interceptor de inicio de sesión puede encontrar este user
objeto y no es necesario volver a interceptar la interfaz de inicio de sesión.
@RequestMapping(value = {
"", "/", "/index"}, method = RequestMethod.GET)
public String index(Model model, HttpServletRequest request) {
User user = (User) request.getSession().getAttribute("user");
model.addAttribute("user", user);
return "users/index";
}
@RequestMapping(value = {
"/login"}, method = RequestMethod.GET)
public String loginIndex() {
return "users/login";
}
@RequestMapping(value = {
"/login"}, method = RequestMethod.POST)
public String login(@RequestParam(name = "username")String username, @RequestParam(name = "password")String password,
Model model, HttpServletRequest request) {
User user = userService.getPwdByUsername(username);
String pwd = user.getPassword();
String password1 = MD5Utils.md5Code(password).toUpperCase();
String password2 = MD5Utils.md5Code(password1).toUpperCase();
if (pwd.equals(password2)) {
model.addAttribute("user", user);
request.getSession().setAttribute("user", user);
return "redirect:/index";
} else {
return "users/failed";
}
}
2. Implementación de código y ejemplos
La implementación del código se muestra arriba.
Después de que el inicio de sesión sea exitoso, guarde la user
información session
, la próxima vez que inicie sesión, el navegador SESSIONID
puede encontrar el correspondiente según el suyo session
, así que no vuelva a iniciar sesión, puede verlo desde el navegador Chrome.
3. Verificación de la eficacia
3.1. Visite el localhost: 8081 / página de índice:
Fue redirigido a localhost: 8081 / login, que realizó la interceptación de inicio de sesión.
3.2. Introduzca correctamente el nombre de usuario y la contraseña para iniciar sesión
3.3, visite localhost: 8081 / index nuevamente
El interceptor de inicio de sesión no lo vuelve a interceptar, lo que demuestra que se puede mantener el inicio de sesión.