SpringMVC-Interceptor — оценка статуса входа пользователя

Spring

предисловие

Если пользователь хочет изменить свою личную информацию, он должен войти в систему

В этой статье мы кратко настроим использование перехватчиков, а также дадим несколько кратких вводных


окружающая обстановка

  • idea
  • Все зависимости Spring версии 5.0.0.RELEASE
  • jdk 1.8

....

Начинать

SpringMVC предоставляет несколько механизмов для перехватчиков Interceptor:

  • выполнитьHandlerInterceptorинтерфейс
  • Наследование реализованоHandlerInterceptorКласс интерфейса
  • выполнитьWebRequestInterceptorинтерфейс
  • Наследование реализованоWebRequestInterceptorкласс интерфейса

Я бы использовал реализациюHandlerInterceptorМеханизм интерфейса, другие могут выходить в Интернет для проверки информации, использование аналогично

ПроверитьHandlerInterceptorИсходный код интерфейса:

public interface HandlerInterceptor {

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)	throws Exception {
		return true;
	}

	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable ModelAndView modelAndView) throws Exception {
	}

	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,@Nullable Exception ex) throws Exception {
	}

}

Роль трех методов:

  • preHandle: Выполнить перед выполнением метода Handler, возвращаемое значение логического типа, если возвращает false, значит перехватывает запрос и больше не выполняется вниз, если возвращает true, значит освобождает, а программа продолжает падать (если позади нет других перехватчиков, он будет напрямую выполнять метод контроллера)

  • postHandle: после выполнения обработчика перед возвратом в ModelAndView

  • afterCompletion: выполнить после выполнения обработчика. Поскольку метод выполняется после выполнения метода контроллера, этот метод подходит для унифицированных операций обработки исключений или журналов.


Создайте блок входа

  • Контроллер входа:
package com.ujiuye.controller;


import com.ujiuye.domain.User;
import com.ujiuye.exception.UserException;
import com.ujiuye.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;

@Controller
public class LoginController {

    @Autowired
    private IUserService userService;

    //登录方法
    @RequestMapping("login")
    public String login(String username, String password,
                        HttpSession session, Model model) throws UserException {
        User user = userService.selectLogin(username, password);
        if (user!=null){
            //user对象放入session作用域
            session.setAttribute("USER_IN_SESSION",user);
            //跳转到用户列表页面
            return "redirect:/user/query.do";
        }else {
            //跳转到登录页面,提示用户名或密码错误
            model.addAttribute("msg","用户名或者密码错误");
            return "forward:/login.jsp";
        }
    }
}

  • Проверка входа
package com.ujiuye.interceptor;


import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginInterceptor implements HandlerInterceptor {

    //登录检查,实现接口里的这个方法
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //判断session中是否有"USER_IN_SESSION"的key
        HttpSession session = request.getSession();
        Object user = session.getAttribute("USER_IN_SESSION");
        if (user == null){
            //跳转到登录页面
            response.sendRedirect("login.jsp");
            return  false;
        }
        return true;
    }
}

Проверьте, имеет ли сессия ключ USER_IN_SESSION, если да, то это означает, что вы вошли в систему, в противном случае;

Настройка глобальных перехватчиков

В файле springMVC.xml

    <!--拦截器-->
    <mvc:interceptors>
        <mvc:interceptor>
            <!--拦截的路径/*一级路径 /**所有路径-->
            <mvc:mapping path="/**"/>
            <!--排除登录页面-->
            <mvc:exclude-mapping path="/login.do"/>
            <!-- 拦截器类-->
            <bean class="com.ujiuye.interceptor.LoginInterceptor"></bean>
        </mvc:interceptor>
		<mvc:interceptor>
            <!--第二个拦截器-->
        </mvc:interceptor>
       <mvc:interceptor>
           <!--第三个拦截器-->
        </mvc:interceptor>
    </mvc:interceptors>

Не забудьте исключить страницу входа;

</mvc:interceptors>: Под меткой можно создать несколько перехватчиков, выполняемых сверху вниз


Суммировать

По сути, после успешного входа в сессию ставится ключ, а затем реализуется перехватчик.HandlerInterceptorИнтерфейс, реализуйте методы внутри и определите, есть ли у сеанса ключ входа в систему. Если он есть, он уже вошел в систему. Если нет, он вернется на страницу входа, чтобы пользователи не могли напрямую войти на более глубокую страницу.

Затем настройте его в файле конфигурации springMVC.xml.глобальный перехватчик, Ничего страшного.

Разница между двумя интерфейсами

HandlerInterceptor: в основном выполнять предварительный запрос и перехват после запроса.

а такжеWebRequestInterceptor:интерфейс перехватчика для запроса, в этом интерфейсе нет интерфейсаresponse(ответ), поэтому этот интерфейс только подготавливает и обрабатывает данные запроса

ПроверитьWebRequestInterceptorИсходный код интерфейса:

public interface WebRequestInterceptor {

	// 该方法返回值为 **void**,无返回值, 由于没有返回值, 所以使用该方法主要进行数据的前期准备,
	void preHandle(WebRequest request) throws Exception;

	void postHandle(WebRequest request, @Nullable ModelMap model) throws Exception;

	void afterCompletion(WebRequest request, @Nullable Exception ex) throws Exception;

}

личный блог:aaatao66.github.io/

Самородки:Талант /user/536217…

Эта статья очень короткая, использование второго интерфейса описано не слишком много, если вы хотите знать, вы можете пойти в Интернет, чтобы найти соответствующую информацию.