文末本文转载自微信公众号「程序员千羽 」,作者程序员千羽。转载本文请联系程序员千羽公众号。
GitHub:https://github.com/nateshao/ssm/tree/master/110-springmvc-intercepter
什么是拦截器?
Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。
要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。
- 第一种:通过实现HandlerInterceptor接口,或继承HandlerInterceptor接口的实现类(如HandlerInterceptorAdapter)来定义。
- 第二种:通过实现WebRequestInterceptor接口,或继承WebRequestInterceptor接口的实现类来定义。
以实现HandlerInterceptor接口方式为例,自定义拦截器类的代码如下:
- public class CustomInterceptor implements HandlerInterceptor {
-
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- System.out.println("CustomInterceptor...preHandle");
- //对拦截的请求进行放行处理
- return true;
- }
-
-
- @Override
- public void postHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- ModelAndView modelAndView) throws Exception {
- System.out.println("CustomInterceptor...postHandle");
- }
-
-
- @Override
- public void afterCompletion(HttpServletRequest request,
- HttpServletResponse response, Object handler,
- Exception ex) throws Exception {
- System.out.println("CustomInterceptor...afterCompletion");
- }
- }
要使自定义的拦截器类生效,还需要在Spring MVC的配置文件中进行配置。
- -- 全局拦截器,拦截所有请求 -->
-
"com.nateshao.interceptor.CustomInterceptor" />// -
-
- -- **配置,表示拦截所有路径 -->
-
" - public class LoginInterceptor implements HandlerInterceptor {
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- // 获取请求的URL
- String url = request.getRequestURI();
- // URL:除了login.jsp是可以公开访问的,其它的URL都进行拦截控制
- if (url.indexOf("/login") >= 0) {
- return true;
- }
- // 获取Session
- HttpSession session = request.getSession();
- User user = (User) session.getAttribute("USER_SESSION");
- // 判断Session中是否有用户数据,如果有,则返回true,继续向下执行
- if (user != null) {
- return true;
- }
- // 不符合条件的给出提示信息,并转发到登录页面
- request.setAttribute("msg", "您还没有登录,请先登录!");
- request.getRequestDispatcher("/WEB-INF/jsp/login.jsp")
- .forward(request, response);
- 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 {
- }
- }
UserController.java
- package com.nateshao.controller;
-
- import com.nateshao.po.User;
- 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.HttpSession;
-
-
- @Controller
- public class UserController {
-
- @RequestMapping(value = "/login", method = RequestMethod.GET)
- public String toLogin() {
- return "login";
- }
-
-
- @RequestMapping(value = "/login", method = RequestMethod.POST)
- public String login(User user, Model model, HttpSession session) {
- // 获取用户名和密码
- String username = user.getUsername();
- String password = user.getPassword();
- // 此处模拟从数据库中获取用户名和密码后进行判断
- if (username != null && username.equals("nateshao")
- && password != null && password.equals("123456")) {
- // 将用户对象添加到Session
- session.setAttribute("USER_SESSION", user);
- // 重定向到主页面的跳转方法
- return "redirect:main";
- }
- model.addAttribute("msg", "用户名或密码错误,请重新登录!");
- return "login";
- }
-
-
- @RequestMapping(value = "/main")
- public String toMain() {
- return "main";
- }
-
-
- @RequestMapping(value = "/logout")
- public String logout(HttpSession session) {
- // 清除Session
- session.invalidate();
- // 重定向到登录页面的跳转方法
- return "redirect:login";
- }
- }
main.jsp
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
-
-
- "Content-Type" content="text/html; charset=UTF-8">
系统主页 -
-
- 当前用户:${USER_SESSION.username}
- "${pageContext.request.contextPath }/logout">退出
-
-
验证
浏览器输入:http://localhost:8080/110_springmvc_interceptor_war_exploded/main
输入用户名密码
总结
这一篇文章主要对Spring MVC中的拦截器使用进行了详细讲解。
首先介绍了如何在Spring MVC项目中定义和配置拦截器,然后详细讲解了单个拦截器和多个拦截器的执行流程,最后通过一个用户登录权限验证的应用案例演示了拦截器的实际应用。
最后我们可以对Spring MVC中拦截器的定义和配置方式有一定的了解,能够熟悉拦截器的执行流程,并能够掌握拦截器的使用。