предисловие
Если пользователь хочет изменить свою личную информацию, он должен войти в систему
В этой статье мы кратко настроим использование перехватчиков, а также дадим несколько кратких вводных
окружающая обстановка
- 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…
Эта статья очень короткая, использование второго интерфейса описано не слишком много, если вы хотите знать, вы можете пойти в Интернет, чтобы найти соответствующую информацию.