源码地址

拦截器interceptor

拦截器是URL请求的第一道门,所有请求会先经过拦截器interceptor,然后再进入controller

下面,记录一种通过注解方法拦截所有需要登录才能发起的请求,并且把非法请求重定向到登录界面

xml文件基本配置

  1. <!--配置拦截器, 多个拦截器,顺序执行 -->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
  5. <mvc:mapping path="/**" />
  6. <!--resource不拦截-->
  7. <mvc:exclude-mapping path="/asset/**"/>
  8. <mvc:exclude-mapping path="/assets/**"/>
  9. <!--聊天室websocket不拦截-->
  10. <mvc:exclude-mapping path="/sockjs/websocket"/>
  11. <mvc:exclude-mapping path="/websocket"/>
  12. <bean class="com.iss.blog.interceptor.AccessControlInterceptor"/>
  13. </mvc:interceptor>
  14. <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
  15. </mvc:interceptors>
  16. <!-- 静态资源访问(不拦截此目录下的东西的访问) -->
  17. <mvc:resources location="/asset/" mapping="/asset/**" />
  18. <mvc:resources location="/assets/" mapping="/assets/**" />

关键实现HandlerInterceptorAdapter

  1. public abstract class AbstractInterceptor extends HandlerInterceptorAdapter {
  2. /**
  3. * 是否有 PublicPage注解
  4. * @param handlerMethod
  5. * @return
  6. */
  7. protected boolean isPublicPage(HandlerMethod handlerMethod){
  8. if (handlerMethod==null)
  9. return false;
  10. PublicPage publicPage = handlerMethod.getMethodAnnotation(PublicPage.class);
  11. if (publicPage!=null){
  12. return true;
  13. }
  14. return false;
  15. }
  16. /**
  17. * 某个请求是否ajax请求
  18. * @param request
  19. * @return
  20. */
  21. protected boolean isAjaxRequest(HttpServletRequest request){
  22. String requestType = request.getHeader("X-Requested-With");
  23. if("XMLHttpRequest".equals(requestType)){
  24. System.out.println("is AJAX request");
  25. return true;
  26. }else{
  27. System.out.println("is not AJAX request");
  28. return false;
  29. }
  30. }
  31. }
  32. public class AccessControlInterceptor extends AbstractInterceptor {
  33. /**
  34. * 下面这段话参考了某片文章,由于找不回原文,所以参考链接不贴
  35. * 在业务处理器处理请求之前被调用
  36. * 如果返回false
  37. * 从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
  38. * 如果返回true
  39. * 执行下一个拦截器,直到所有的拦截器都执行完毕
  40. * 再执行被拦截的Controller
  41. * 然后进入拦截器链,
  42. * 从最后一个拦截器往回执行所有的postHandle()
  43. * 接着再从最后一个拦截器往回执行所有的afterCompletion()
  44. */
  45. @Override
  46. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  47. if (handler instanceof HandlerMethod &&isPublicPage((HandlerMethod) handler)){
  48. return true;
  49. }
  50. if(没有登录){
  51. PrintWriter out = response.getWriter();
  52. out.append(
  53. "{'resultCode':1012,'resultMessage':'错误的请求'}"
  54. );
  55. if (!isAjaxRequest(request)) {
  56. //这里把请求转发给登录界面
  57. request.getRequestDispatcher("/login").forward(request, response);
  58. }
  59. return false;
  60. }else
  61. return true;
  62. }
  63. /**
  64. * 在业务处理器处理请求执行完成后,生成视图之前执行的动作
  65. * 可在modelAndView中加入数据,比如当前时间
  66. */
  67. @Override
  68. public void postHandle(HttpServletRequest request,
  69. HttpServletResponse response, Object handler,
  70. ModelAndView modelAndView) throws Exception {
  71. }
  72. /**
  73. * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
  74. *
  75. * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
  76. */
  77. @Override
  78. public void afterCompletion(HttpServletRequest request,
  79. HttpServletResponse response, Object handler, Exception ex)
  80. throws Exception {
  81. }
  82. }

定义的注解

  1. @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
  2. @Retention(RetentionPolicy.RUNTIME)
  3. @Documented
  4. public @interface PublicPage {
  5. String value() default "";
  6. }

这样,在@RequestMapping上加上@PublicPage就代表,这样路由不需要登录就可以请求到,否则需要登录后才能请求到

比如登录页面:

  1. @PublicPage
  2. @RequestMapping("/login")
  3. public String loginPage(){
  4. return "frontend/account/login";
  5. }

必须为ajax请求才可以访问

  1. @RequestMapping(value = "/registerValidate",headers = { "X-Requested-With=XMLHttpRequest" })

SpringMVC拦截器使用的更多相关文章

  1. SpringMVC拦截器的使用

    SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那 ...

  2. SpringMVC拦截器详解[附带源码分析]

    目录 前言 重要接口及类介绍 源码分析 拦截器的配置 编写自定义的拦截器 总结 总结 前言 SpringMVC是目前主流的Web MVC框架之一. 如果有同学对它不熟悉,那么请参考它的入门blog:h ...

  3. SpringMVC拦截器2(资源和权限管理)(作为补充说明)

    SpringMVC拦截器(资源和权限管理) 1.DispatcherServlet SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServle ...

  4. SpringMVC拦截器(实现登录验证拦截器)

    本例实现登陆时的验证拦截,采用SpringMVC拦截器来实现 当用户点击到网站主页时要进行拦截,用户登录了才能进入网站主页,否则进入登陆页面 核心代码 首先是index.jsp,显示链接 <%@ ...

  5. Spring+SpringMVC+MyBatis深入学习及搭建(十七)——SpringMVC拦截器

    转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7098753.html 前面讲到:Spring+SpringMVC+MyBatis深入学习及搭建(十六)--S ...

  6. SpringMVC拦截器Interceptor

    SpringMVC拦截器(Interceptor)实现对每一个请求处理前后进行相关的业务处理,类似与servlet中的Filter. SpringMVC 中的Interceptor 拦截请求是通过Ha ...

  7. 五 : springMVC拦截器

    springMVC拦截器的实现一般有两种方式 第一种方式是要定义的Interceptor类要实现了Spring的HandlerInterceptor 接口 第二种方式是继承实现了HandlerInte ...

  8. 基于SpringMVC拦截器和注解实现controller中访问权限控制

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...

  9. 解决SpringMVC拦截器中Request数据只能读取一次的问题

    解决SpringMVC拦截器中Request数据只能读取一次的问题 开发项目中,经常会直接在request中取数据,如Json数据,也经常用到@RequestBody注解,也可以直接通过request ...

  10. springmvc拦截器的简单了解

    1.定义一个拦截器 2.在springmvc.xml中配置拦截器. (1)拦截器拦截的请求是建立在前端控制器配置之下的,若DispatcherServlet拦截的是*.action,则拦截器即使配置 ...

随机推荐

  1. [JavaWeb基础] 031.dom4j写入xml的方法

    上一篇我们讲述了dom4j读取xml的4种方法,甚是精彩,那么怎么样写入xml呢?我们直接看下源码实现. public static void main(String[] args) throws E ...

  2. require.js与IDEA的配合

    本文主要讲述在html中使用requirejs时,如何让IDEA更加智能识别javascript的方法. 测试时的目录结构,一种典型的 thinkphp 的结构,同时,在 a.thml 中通过 req ...

  3. Java实现 LeetCode 404 左叶子之和

    404. 左叶子之和 计算给定二叉树的所有左叶子之和. 示例: 3 / \ 9 20 / \ 15 7 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24 /** * Definiti ...

  4. Java实现 蓝桥杯VIP 算法训练 打印下述图形

    算法训练 4-1打印下述图形 时间限制:1.0s 内存限制:256.0MB 问题描述 使用循环结构打印下述图形,打印行数n由用户输入.打印空格时使用"%s"格式,向printf函数 ...

  5. Java实现最大连续乘积子数组

    1 问题描述 给定一个浮点数组,任意取出数组中的若干个连续的数相乘,请找出其中乘积最大的子数组. 2 解决方案 2.1 蛮力法 该方法的时间复杂度为O(n^2). package com.liuzhe ...

  6. java实现第六届蓝桥杯移动距离

    移动距离 题目描述 X星球居民小区的楼房全是一样的,并且按矩阵样式排列.其楼房的编号为1,2,3- 当排满一行时,从下一行相邻的楼往反方向排号. 比如:当小区排号宽度为6时,开始情形如下: 1 2 3 ...

  7. Maven发布Release到中心仓库历程记录(无个人域名)

    Maven发布Release到中心仓库历程记录(无个人域名) 前言 因为前段时间自己做了一个爬虫项目(地址),自己很希望分享到maven中心仓库上,感觉拥有自己的jar包令我兴奋,便开始了maven发 ...

  8. 简谈Java语言的封装

    简谈Java语言的封装 封装的定义 封装将复杂模块或系统的逻辑实现细节隐藏,让使用者只需要关心这个模块或系统怎么使用,而不用关心这个模块或系统是怎么实现的. 在面向对象的的编程中,我们一般通过接口来描 ...

  9. iOS -iOS9中提示框(UIAlertController)的常见使用

    iOS 8 之前提示框主要使用 UIAlertView和UIActionSheet:iOS 9 将UIAlertView和UIActionSheet合二为一为:UIAlertController . ...

  10. VMware15 镜像Centos7修改静态IP

    VMware15 镜像Centos7修改静态IP * 我的网卡名称为ens33: * 配置IP在 /etc/sysconfig/network-scripts/ifcfg-ens33 目录下: * D ...