文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

一篇学会拦截器的骚操作

2024-12-02 17:40

关注

文末本文转载自微信公众号「程序员千羽 」,作者程序员千羽。转载本文请联系程序员千羽公众号。

GitHub:https://github.com/nateshao/ssm/tree/master/110-springmvc-intercepter

什么是拦截器?

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

要使用Spring MVC中的拦截器,就需要对拦截器类进行定义和配置。通常拦截器类可以通过两种方式来定义。

以实现HandlerInterceptor接口方式为例,自定义拦截器类的代码如下:

  1. public class CustomInterceptor implements HandlerInterceptor { 
  2.      
  3.     @Override 
  4.     public boolean preHandle(HttpServletRequest request, 
  5.                              HttpServletResponse response, Object handler) throws Exception { 
  6.         System.out.println("CustomInterceptor...preHandle"); 
  7.         //对拦截的请求进行放行处理 
  8.         return true
  9.     } 
  10.  
  11.      
  12.     @Override 
  13.     public void postHandle(HttpServletRequest request, 
  14.                            HttpServletResponse response, Object handler, 
  15.                            ModelAndView modelAndView) throws Exception { 
  16.         System.out.println("CustomInterceptor...postHandle"); 
  17.     } 
  18.  
  19.      
  20.     @Override 
  21.     public void afterCompletion(HttpServletRequest request, 
  22.                                 HttpServletResponse response, Object handler, 
  23.                                 Exception ex) throws Exception { 
  24.         System.out.println("CustomInterceptor...afterCompletion"); 
  25.     } 

要使自定义的拦截器类生效,还需要在Spring MVC的配置文件中进行配置。

  1.  
  2.         --    全局拦截器,拦截所有请求    --> 
  3.         "com.nateshao.interceptor.CustomInterceptor"/>// 
  4.  
  5.          
  6.         --   **配置,表示拦截所有路径  --> 
  7.             
  8. public class LoginInterceptor implements HandlerInterceptor { 
  9.     @Override 
  10.     public boolean preHandle(HttpServletRequest request, 
  11.                              HttpServletResponse response, Object handler) throws Exception { 
  12.         // 获取请求的URL 
  13.         String url = request.getRequestURI(); 
  14.         // URL:除了login.jsp是可以公开访问的,其它的URL都进行拦截控制 
  15.         if (url.indexOf("/login") >= 0) { 
  16.             return true
  17.         } 
  18.         // 获取Session 
  19.         HttpSession session = request.getSession(); 
  20.         User user = (User) session.getAttribute("USER_SESSION"); 
  21.         // 判断Session中是否有用户数据,如果有,则返回true,继续向下执行 
  22.         if (user != null) { 
  23.             return true
  24.         } 
  25.         // 不符合条件的给出提示信息,并转发到登录页面 
  26.         request.setAttribute("msg""您还没有登录,请先登录!"); 
  27.         request.getRequestDispatcher("/WEB-INF/jsp/login.jsp"
  28.                 .forward(request, response); 
  29.         return false
  30.     } 
  31.  
  32.     @Override 
  33.     public void postHandle(HttpServletRequest request, 
  34.                            HttpServletResponse response, Object handler, 
  35.                            ModelAndView modelAndView) throws Exception { 
  36.     } 
  37.  
  38.     @Override 
  39.     public void afterCompletion(HttpServletRequest request, 
  40.                                 HttpServletResponse response, Object handler, Exception ex) 
  41.             throws Exception { 
  42.     } 

UserController.java

  1. package com.nateshao.controller; 
  2.  
  3. import com.nateshao.po.User
  4. import org.springframework.stereotype.Controller; 
  5. import org.springframework.ui.Model; 
  6. import org.springframework.web.bind.annotation.RequestMapping; 
  7. import org.springframework.web.bind.annotation.RequestMethod; 
  8. import javax.servlet.http.HttpSession; 
  9.  
  10.  
  11. @Controller 
  12. public class UserController { 
  13.      
  14.     @RequestMapping(value = "/login", method = RequestMethod.GET) 
  15.     public String toLogin() { 
  16.         return "login"
  17.     } 
  18.  
  19.      
  20.     @RequestMapping(value = "/login", method = RequestMethod.POST) 
  21.     public String login(User user, Model model, HttpSession session) { 
  22.         // 获取用户名和密码 
  23.         String username = user.getUsername(); 
  24.         String password = user.getPassword(); 
  25.         // 此处模拟从数据库中获取用户名和密码后进行判断 
  26.         if (username != null && username.equals("nateshao"
  27.                 && password != null && password.equals("123456")) { 
  28.             // 将用户对象添加到Session 
  29.             session.setAttribute("USER_SESSION"user); 
  30.             // 重定向到主页面的跳转方法 
  31.             return "redirect:main"
  32.         } 
  33.         model.addAttribute("msg""用户名或密码错误,请重新登录!"); 
  34.         return "login"
  35.     } 
  36.  
  37.      
  38.     @RequestMapping(value = "/main"
  39.     public String toMain() { 
  40.         return "main"
  41.     } 
  42.  
  43.      
  44.     @RequestMapping(value = "/logout"
  45.     public String logout(HttpSession session) { 
  46.         // 清除Session 
  47.         session.invalidate(); 
  48.         // 重定向到登录页面的跳转方法 
  49.         return "redirect:login"
  50.     } 

main.jsp

  1. <%@ page language="java" contentType="text/html; charset=UTF-8" 
  2.      pageEncoding="UTF-8"%> 
  3.  
  4.  
  5. "Content-Type" content="text/html; charset=UTF-8"
  6. 系统主页 
  7.  
  8.  
  9.     当前用户:${USER_SESSION.username}   
  10.     "${pageContext.request.contextPath }/logout">退出   
  11.  
  12.  

验证

浏览器输入:http://localhost:8080/110_springmvc_interceptor_war_exploded/main

输入用户名密码

总结

这一篇文章主要对Spring MVC中的拦截器使用进行了详细讲解。

首先介绍了如何在Spring MVC项目中定义和配置拦截器,然后详细讲解了单个拦截器和多个拦截器的执行流程,最后通过一个用户登录权限验证的应用案例演示了拦截器的实际应用。 

最后我们可以对Spring MVC中拦截器的定义和配置方式有一定的了解,能够熟悉拦截器的执行流程,并能够掌握拦截器的使用。

 

来源:程序员千羽 内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯