1.DispatcherServlet

SpringMVC具有统一的入口DispatcherServlet,所有的请求都通过DispatcherServlet。
    DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自已定义,把拦截下来的请求,依据某某规则分发到目标Controller来处理。  所以我们现在web.xml中加入以下配置:

[html] view plaincopy print?
  1. <!-- 初始化 DispatcherServlet时,该框架在 web应用程序WEB-INF目录中寻找一个名为[servlet-名称]-servlet.xml的文件,
  2. 并在那里定义相关的Beans,重写在全局中定义的任何Beans -->
  3. <servlet>
  4. <servlet-name>springMybatis</servlet-name>
  5. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  6. <load-on-startup>1</load-on-startup>
  7. </servlet>
  8. <servlet-mapping>
  9. <servlet-name>springMybatis</servlet-name>
  10. <!-- 所有的的请求,都会被DispatcherServlet处理 -->
  11. <url-pattern>/</url-pattern>
  12. </servlet-mapping>

2.静态资源不拦截

如果只配置拦截类似于*.do格式的url,则对静态资源的访问是没有问题的,但是如果配置拦截了所有的请求(如我们上面配置的“/”),就会造成js文件、css文件、图片文件等静态资源无法访问。
      一般实现拦截器主要是为了权限管理,主要是拦截一些url请求,所以不对静态资源进行拦截。要过滤掉静态资源一般有两种方式,
       第一种 是采用<mvc:default-servlet-handler />,(一般Web应用服务器默认的Servlet名称是"default",所以这里我们激活Tomcat的defaultServlet来处理静态文件,在web.xml里配置如下代码即可:)

[html] view plaincopy print?
  1. <!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -->
  2. <!-- 不拦截静态文件 -->
  3. <servlet-mapping>
  4. <servlet-name>default</servlet-name>
  5. <url-pattern>/js/*</url-pattern>
  6. <url-pattern>/css/*</url-pattern>
  7. <url-pattern>/images/*</url-pattern>
  8. <url-pattern>/fonts/*</url-pattern>
  9. </servlet-mapping>

Tomcat, Jetty, JBoss, and GlassFish  默认 Servlet的名字 -- "default"
        Resin 默认 Servlet的名字 -- "resin-file"
        WebLogic 默认 Servlet的名字  -- "FileServlet"
        WebSphere  默认 Servlet的名字 -- "SimpleFileServlet"
        
       如果你所有的Web应用服务器的默认Servlet名称不是"default",则需要通过default-servlet-name属性显示指定:

[html] view plaincopy print?
  1. <mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

第二种是采用<mvc:resources />,在springmvc的配置文件中加入以下代码:

[html] view plaincopy print?
  1. <mvc:resources mapping="/js/**" location="/static_resources/javascript/"/>
  2. <mvc:resources mapping="/styles/**" location="/static_resources/css/"/>
  3. <mvc:resources mapping="/images/**" location="/static_resources/images/"/>

3.自定义拦截器

SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法。preHandle在业务处理器处理请求之前被调用,
    postHandle在业务处理器处理请求执行完成后,生成视图之前执行,afterCompletion在DispatcherServlet完全处理完请求后被调用,可用于清理资源等 。所以要想实现自己的权限管理逻辑,需要继承HandlerInterceptorAdapter并重写其三个方法。
    首先在springmvc.xml中加入自己定义的拦截器我的实现逻辑CommonInterceptor,

[html] view plaincopy print?
  1. <!--配置拦截器, 多个拦截器,顺序执行 -->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->
  5. <mvc:mapping path="/" />
  6. <mvc:mapping path="/user/**" />
  7. <mvc:mapping path="/test/**" />
  8. <bean class="com.alibaba.interceptor.CommonInterceptor"></bean>
  9. </mvc:interceptor>
  10. <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
  11. </mvc:interceptors>

我的拦截逻辑是“在未登录前,任何访问url都跳转到login页面;登录成功后跳转至先前的url”,具体代码如下:

[java] view plaincopy print?
  1. /**
  2. *
  3. */
  4. package com.alibaba.interceptor;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.web.servlet.ModelAndView;
  10. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  11. import com.alibaba.util.RequestUtil;
  12. /**
  13. * @author tfj
  14. * 2014-8-1
  15. */
  16. public class CommonInterceptor extends HandlerInterceptorAdapter{
  17. private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);
  18. public static final String LAST_PAGE = "com.alibaba.lastPage";
  19. /*
  20. * 利用正则映射到需要拦截的路径
  21. private String mappingURL;
  22. public void setMappingURL(String mappingURL) {
  23. this.mappingURL = mappingURL;
  24. }
  25. */
  26. /**
  27. * 在业务处理器处理请求之前被调用
  28. * 如果返回false
  29. *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链
  30. * 如果返回true
  31. *    执行下一个拦截器,直到所有的拦截器都执行完毕
  32. *    再执行被拦截的Controller
  33. *    然后进入拦截器链,
  34. *    从最后一个拦截器往回执行所有的postHandle()
  35. *    接着再从最后一个拦截器往回执行所有的afterCompletion()
  36. */
  37. @Override
  38. public boolean preHandle(HttpServletRequest request,
  39. HttpServletResponse response, Object handler) throws Exception {
  40. if ("GET".equalsIgnoreCase(request.getMethod())) {
  41. RequestUtil.saveRequest();
  42. }
  43. log.info("==============执行顺序: 1、preHandle================");
  44. String requestUri = request.getRequestURI();
  45. String contextPath = request.getContextPath();
  46. String url = requestUri.substring(contextPath.length());
  47. log.info("requestUri:"+requestUri);
  48. log.info("contextPath:"+contextPath);
  49. log.info("url:"+url);
  50. String username =  (String)request.getSession().getAttribute("user");
  51. if(username == null){
  52. log.info("Interceptor:跳转到login页面!");
  53. request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
  54. return false;
  55. }else
  56. return true;
  57. }
  58. /**
  59. * 在业务处理器处理请求执行完成后,生成视图之前执行的动作
  60. * 可在modelAndView中加入数据,比如当前时间
  61. */
  62. @Override
  63. public void postHandle(HttpServletRequest request,
  64. HttpServletResponse response, Object handler,
  65. ModelAndView modelAndView) throws Exception {
  66. log.info("==============执行顺序: 2、postHandle================");
  67. if(modelAndView != null){  //加入当前时间
  68. modelAndView.addObject("var", "测试postHandle");
  69. }
  70. }
  71. /**
  72. * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等
  73. *
  74. * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()
  75. */
  76. @Override
  77. public void afterCompletion(HttpServletRequest request,
  78. HttpServletResponse response, Object handler, Exception ex)
  79. throws Exception {
  80. log.info("==============执行顺序: 3、afterCompletion================");
  81. }
  82. }

注:上述代码里我写了一个RequestUtil,主要实现获取当前Request、Session对象,保存和加密页面,取出等功能。

至此,拦截器已经实现了,效果如图:

我直接访问/test/hello,会被拦截

登录成功后会跳转至/test/hello对应的页面

SpringMVC工作总结001_SpringMVC拦截器(资源和权限管理)相关推荐

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

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

  2. SpringMVC中使用Interceptor拦截器

    2019独角兽企业重金招聘Python工程师标准>>> SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理. ...

  3. springMVC之mvc:interceptors拦截器的用法

    1.配置拦截器 在springMVC.xml配置文件增加: <mvc:interceptors><!-- 日志拦截器 --><mvc:interceptor>< ...

  4. SSM之SpringMVC 04 —— Ajax、拦截器、文件上传和下载

    系列文章 SSM之SpringMVC 01 -- SpringMVC原理及概念.Hello SpringMVC 注解版和配置版 SSM之SpringMVC 02 -- Controller和RestF ...

  5. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈

    工作原理 实现拦截器 样例 Struts2自带拦截器 拦截器栈(先进后出) TOKEN防表单重复提交 文字拦截器 AJAX

  6. 拦截器,利用拦截器进行登陆权限控制

    拦截器,登录权限控制demo 1. 拦截器demo 2. 登录权限控制 地址: https://github.com/sevenyoungairye/spring-mvc-interceptor 1. ...

  7. SpringMVC→拦截器、SpringMVC拦截器实现、多个拦截器工作原理、拦截器使用场景、拦截器Interceptor与过滤器Filter区别

    拦截器 拦截器实现 多个拦截器工作原理 拦截器使用场景 请求编码设置及请求登录Session校验 使用时间段设置 拦截器Interceptor与过滤器Filter区别

  8. springmvc二十九:拦截器

    Springmvc提供了拦截器机制; 允许运行目标方法之前进行一些拦截工作,或者目标方法运行之后进行一些其他处理. Filter(过滤器)是javaweb定义的. 拦截器是springmvc定义的. ...

  9. SpringMVC中过滤器和拦截器的区别

    文章目录 1.引言 2.共同点 3.区别 3.1.拦截器 3.2.过滤器 4.具体实现 4.1.拦截器 4.1.1.拦截实现方式 4.1.2.拦截实现 4.2.过滤器 4.2.1.过滤器实现方式 4. ...

最新文章

  1. Python进阶之路 3.4.2 条件语句(if、else和elif)
  2. 黑洞是如何被拍照的?
  3. 又是加拿大!连年拒签NeurIPS参会者被指太荒唐,Hinton亲自过问也没辙
  4. Python每日一练0004
  5. springboot项目中session和cookie
  6. 《球球大作战》游戏优化之路(下)
  7. [yii2] 实现所有action方法之前执行一段代码或者方法
  8. c语言分量的运算符,C语言基础(04-运算符和表达式)
  9. linux文件夹重命名busy,Linux下执行程序出现 Text file busy 提示时的解决方法
  10. ⑥NuPlayer播放源码分析之DecoderBase分析
  11. android SDK安装以及环境变量配置
  12. HDU2050 由直线分割平面推广到折线分割平面
  13. 计算机科学导论第五版第二章答案,《计算机科学导论》课后习题答案
  14. 高漫 1060 Pro 数位板 Mac OS X 下无法设置 shift 快捷键解决方法
  15. mysql 字段名 减号_MySQL减号
  16. BootStrap Table:列参数
  17. 笔记:基本的世代交叠模型
  18. 102.(leaflet篇)leaflet态势标绘-分队战斗行动修改 (燕尾)
  19. 武林秘籍之设计模式迷你手册
  20. deepnode软件下载地址_Flash cs6软件下载地址及安装教程

热门文章

  1. NYOJ-水池数目(dfs)
  2. 如何画ROC曲线和FROC曲线
  3. 网络监视工具nethogs命令
  4. Pytorch:损失函数
  5. 从0移植uboot (二) _启动流程分析
  6. java多线程采集+线程同步-【多线程数据采集之四】
  7. CSS经典书写技巧之(二)
  8. DELPHI存储过程调用
  9. python打包exe
  10. RMS Server打开或关闭日志记录