知方号

知方号

SpringMVC使用拦截器(Interceptor)实现用户登录校验<登录页面作用>

SpringMVC使用拦截器(Interceptor)实现用户登录校验

在系统中,经常需要在处理用户请求之前和之后执行一些行为,例如检测用户的权限,或者将请求的信息记录到日志中。当然不仅仅这些,所以需要一种机制,拦截用户的请求,在请求的前后添加处理逻辑。

SpringMVC提供了Interceptor拦截器机制,用于请求的预处理和后处理。在SpringMVC中定义一个拦截器有两种方法:第一种是实现HandlerInterceptor接口,或者继承实现了HandlerInterceptor接口的类(例如:HandlerInterceptorAdapter);第二种方法时实现Spring的WebRequestInterceptor接口,或者继承实现了WebRequestInterceptor接口的类。这些拦截器都是在Handler的执行周期内进行拦截操作的。

1、HandlerInterceptor接口

首先来看看HandlerInterceptor接口的源码:

package org.springframework.web.servlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.springframework.lang.Nullable;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 { }}

如果要实现HandlerInterceptor接口,就要实现其三个方法,分别是:preHandle、postHandle、afterCompletion。

(1)preHandle方法在执行Handler方法之前执行。该方法返回值为Boolean类型,如果返回false,表示拦截请求,不在向下执行。而如果返回true,表示放行,程序继续向下进行(如果后面没有其他Interceptor,就会直接执行Controller方法)。所以,此方法可以对请求进行判断,决定程序是否继续执行,或者进行一些前置初始化操作及对请求做预处理。

(2)postHandle方法在执行Handler之后,返回 ModelAndView 之前执行。由于该方法会在前端控制器(DispatcherServlet)进行返回视图渲染之前被调用,所以此方法多被用于统一处理返回的视图,例如将公用的模型数据(例如导航栏菜单)添加到视图,或者根据其他情况制定公用的视图。

(3)afterCompletion方法在执行完Handler之后执行。由于是在Controller方法执行完毕后执行该方法,所以该方法适合进行统一的异常或者日志处理操作。

相关博文:

《JSP/Servlet实现简单的登录校验》

《SpringMVC使用拦截器(Interceptor)实现用户登录校验》

《SpringBoot拦截器的配置并实现用户登录校验》

2、使用拦截器实现用户登录校验

下面通过一个示例来使用拦截器完成登录控制,具体为拦截用户的请求,判断用户是否已经登录,如果用户没有登录,则跳转到login页面,如果用户已经登录,则放行。执行结果如下图:

登录失败,提示失败信息:

登录成功,进入首页:

(1)创建登录拦截器(LoginInterceptor.java),并实现HandlerInterceptor接口,实现其三个方法。这里主要以preHandle方法为主。

package com.pjb.mvc.interceptor;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;/** * 登录拦截器 * @author pan_junbiao **/public class LoginInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String uri = request.getRequestURI(); //判断当前请求地址是否登录地址 if(uri.contains("Login") || uri.contains("login")) { //登录请求,直接放行 return true; } else { //判断用户是否登录 if(request.getSession().getAttribute("user")!=null) { //说明已经登录,放行 return true; } else { //没有登录,跳转到登录界面 response.sendRedirect(request.getContextPath() + "/toLoginPage.action"); } } //默认拦截 return false; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) throws Exception { }}

(2)编写完拦截器的逻辑后,需要在SpringMVC的核心配置文件springmvc.xml中配置该全局拦截器类:

(3)创建登录控制器(LoginController.java),编写登录与登出方法。

package com.pjb.mvc.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import javax.servlet.http.HttpServletRequest;/** * 登录控制器 * @author pan_junbiao **/@Controllerpublic class LoginController{ /** * 登录页面 */ @RequestMapping("/toLoginPage") public String toLoginPage() { //跳转至登录页面 return "login.jsp"; } /** * 登录 */ @RequestMapping(value = "/login", method = RequestMethod.POST) public String login(Model model, HttpServletRequest request, String user, String password) { //验证登录信息 if (user.equals("pan_junbiao的博客") && password.equals("123456")) { //验证成功,记录Session信息 request.getSession().setAttribute("user", user); //重定向到首页 return "redirect:index.jsp"; } else { model.addAttribute("errorMsg", "账号或密码错误!"); } //跳转至登录页面 return "login.jsp"; } /** * 登出 */ @RequestMapping(value = "/logout") public String logout(HttpServletRequest request) { //销毁session对象 request.getSession().invalidate(); //重定向到登录页面 return "redirect:login.jsp"; }}

(4)创建用户登录页面(Login.jsp)。

用户登录 .txtBox{ padding: 3px; width: 250px; font-size: 16px; } 用户登录 账号: 密码: //提交登录 function SubmitLogin() { //判断用户名是否为空 if (!form1.user.value) { alert("请输入用户名!"); form1.user.focus(); return false; } //判断密码是否为空 if (!form1.password.value) { alert("请输入密码!"); form1.password.focus(); return false; } return true; }

(5)创建首页(index.jsp)。

首页 首页

当前Session中保存的登录人名称:${sessionScope.user}

您好,欢迎访问 pan_junbiao的博客!

博客地址:https://blog.csdn.net/pan_junbiao

注销

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至lizi9903@foxmail.com举报,一经查实,本站将立刻删除。