SpringBoot implementa el interceptor de inicio de sesión

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 HandlerInterceptorimplementa el interceptor implementando la WebMvcConfigurerinterfaz, 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 HandlerInterceptorinterfaz

Implementar HandlerInterceptorla interfaz necesidad de implementar tres preHandlemé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方法");
    }
}

preHandleSe ejecuta antes que el Controlador, por lo que la función del interceptor se implementa principalmente en esta parte:

  1. Compruebe si hay un userobjeto en la sesión ;
  2. Si existe, regrese truey luego el Controlador continuará la operación posterior;
  3. 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 ejecutarlo preHandle.

1.2. Implementar la WebMvcConfigurerinterfaz y registrar el interceptor

Implemente la WebMvcConfigurerinterfaz 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 userguardará session. Cuando se vuelva a acceder a la página, el interceptor de inicio de sesión puede encontrar este userobjeto 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 userinformación session, la próxima vez que inicie sesión, el navegador SESSIONIDpuede encontrar el correspondiente según el suyo session, así que no vuelva a iniciar sesión, puede verlo desde el navegador Chrome.
Inserte la descripción de la imagen aquí

3. Verificación de la eficacia

3.1. Visite el localhost: 8081 / página de índice:

Inserte la descripción de la imagen aquí
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

Inserte la descripción de la imagen aquí

3.3, visite localhost: 8081 / index nuevamente

Inserte la descripción de la imagen aquí
El interceptor de inicio de sesión no lo vuelve a interceptar, lo que demuestra que se puede mantener el inicio de sesión.

Supongo que te gusta

Origin blog.csdn.net/qq_27198345/article/details/111401610
Recomendado
Clasificación