1.DispatcherServlet

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

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

  

2.静态资源不拦截

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

<!-- 该servlet为tomcat,jetty等容器提供,将静态资源映射从/改为/static/目录,如原来访问 http://localhost/foo.css ,现在http://localhost/static/foo.css -->
<!-- 不拦截静态文件 -->
<servlet-mapping>  <servlet-name>default</servlet-name>  <url-pattern>/js/*</url-pattern>  <url-pattern>/css/*</url-pattern>  <url-pattern>/images/*</url-pattern>  <url-pattern>/fonts/*</url-pattern>
</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属性显示指定:

<mvc:default-servlet-handler default-servlet-name="所使用的Web服务器默认使用的Servlet名称" />

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

<mvc:resources mapping="/js/**" location="/static_resources/javascript/"/>
<mvc:resources mapping="/styles/**" location="/static_resources/css/"/>
<mvc:resources mapping="/images/**" location="/static_resources/images/"/>

  

3.自定义拦截器

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

<!--配置拦截器, 多个拦截器,顺序执行 -->
<mvc:interceptors>    <mvc:interceptor>    <!-- 匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->  <mvc:mapping path="/" />  <mvc:mapping path="/user/**" />  <mvc:mapping path="/test/**" />  <bean class="com.alibaba.interceptor.CommonInterceptor"></bean>    </mvc:interceptor>  <!-- 当设置多个拦截器时,先按顺序调用preHandle方法,然后逆序调用每个拦截器的postHandle和afterCompletion方法 -->
</mvc:interceptors>

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

/** *  */
package com.alibaba.interceptor;  import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;  import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  import com.alibaba.util.RequestUtil;  /** * @author tfj * 2014-8-1 */
public class CommonInterceptor extends HandlerInterceptorAdapter{  private final Logger log = LoggerFactory.getLogger(CommonInterceptor.class);  public static final String LAST_PAGE = "com.alibaba.lastPage";  /* * 利用正则映射到需要拦截的路径     private String mappingURL; public void setMappingURL(String mappingURL) {     this.mappingURL = mappingURL;     }    */  /**  * 在业务处理器处理请求之前被调用  * 如果返回false  *     从当前的拦截器往回执行所有拦截器的afterCompletion(),再退出拦截器链 * 如果返回true  *    执行下一个拦截器,直到所有的拦截器都执行完毕  *    再执行被拦截的Controller  *    然后进入拦截器链,  *    从最后一个拦截器往回执行所有的postHandle()  *    接着再从最后一个拦截器往回执行所有的afterCompletion()  */    @Override    public boolean preHandle(HttpServletRequest request,    HttpServletResponse response, Object handler) throws Exception {    if ("GET".equalsIgnoreCase(request.getMethod())) {  RequestUtil.saveRequest();  }  log.info("==============执行顺序: 1、preHandle================");    String requestUri = request.getRequestURI();  String contextPath = request.getContextPath();  String url = requestUri.substring(contextPath.length());  log.info("requestUri:"+requestUri);    log.info("contextPath:"+contextPath);    log.info("url:"+url);    String username =  (String)request.getSession().getAttribute("user");   if(username == null){  log.info("Interceptor:跳转到login页面!");  request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);  return false;  }else  return true;     }    /** * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    * 可在modelAndView中加入数据,比如当前时间 */  @Override    public void postHandle(HttpServletRequest request,    HttpServletResponse response, Object handler,    ModelAndView modelAndView) throws Exception {     log.info("==============执行顺序: 2、postHandle================");    if(modelAndView != null){  //加入当前时间    modelAndView.addObject("var", "测试postHandle");    }    }    /**  * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   *   * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  */    @Override    public void afterCompletion(HttpServletRequest request,    HttpServletResponse response, Object handler, Exception ex)    throws Exception {    log.info("==============执行顺序: 3、afterCompletion================");    }    }

  

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

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

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

转载于:https://www.cnblogs.com/skyLogin/p/6577221.html

Spring MVC 拦截器相关推荐

  1. 使用session监听+spring MVC拦截器禁止用户重复登录

    在许多web项目中,需要禁止用户重复登录.一般来说有两种做法: 一是在用户表中维护一个字段isOnLine(是否在线),用户登录时,设定值为true,用户退出时设定为false,在重复登录时,检索到该 ...

  2. spring mvc拦截器_Spring MVC拦截器示例

    spring mvc拦截器 我认为现在是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示说:在传入的HTT ...

  3. Spring MVC拦截器~~~登陆验证拦截

    [ 30 分 钟 轻 松 入 门 Spring MVC][web 三 大 组 件 之 ~ ~ Filter 过 滤 器] Interceptor 拦截器学习: 1.了解spring mvc拦截器的概念 ...

  4. 【Java Web开发学习】Spring MVC 拦截器HandlerInterceptor

    [Java Web开发学习]Spring MVC 拦截器HandlerInterceptor 转载:https://www.cnblogs.com/yangchongxing/p/9324119.ht ...

  5. Java Spring MVC框架 VIII 之 Spring MVC拦截器

    Java Spring MVC框架 VIII 之 Spring MVC拦截器 Spring MVC拦截器 1.拦截器简介 拦截器是SpringMvc框架提供的功能 它可以在控制器方法运行之前或运行之后 ...

  6. spring mvc 拦截器拦截jsp页面

    spring mvc 拦截器怎么拦截jsp页面 你这个 是拦截带 /jsp 的 .do请求 解决方案 用spring 的拦截器 去拦截 所有的 .do 请求, 然后写一个 过滤器去拦截 所有的.jsp ...

  7. Spring MVC拦截器

    1.如何实现登录权限检查 使用session进行约定值的检查 实现方法: (1)使用Filter (2)使用Spring的拦截器 拦截器组件简介:Spring MVC特有组件,可以在调用Control ...

  8. Spring MVC拦截器示例

    我以为是时候看看Spring的MVC拦截器机制了,这种机制已经存在了很多年,并且是一个非常有用的工具. Spring Interceptor会按照提示进行操作:在传入的HTTP请求到达您的Spring ...

  9. Spring MVC拦截器实现

    到这段时, 想起来了以前学底层一些的servlet & jsp技术时, 过滤器和拦截器也有相关实现, 但比起来,spring的实现,可用性高很多. 其它代码不再放上来, 只放拦截器实现和xml ...

  10. 面试:给我说一下Spring MVC拦截器的原理?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | https://urlify.cn/namaQ ...

最新文章

  1. (转)动态SQL和PL/SQL的EXECUTE IMMEDIATE选项
  2. Openstack迁移DDH最佳实践
  3. smarty模板引擎总结六配置网站title,keywords,description
  4. screen实现关闭ssh之后继续运行代码
  5. linux location root访问文件夹404_如何使网站支持https访问?nginx配置https证书
  6. 计算机编程竞赛怎么入门,acm编程比赛入门题目集..pdf
  7. oem718d 基准站设置_诺瓦泰NovAtel OEM718D全系统多频单机测向板卡
  8. [BZOJ1006]神奇的国度
  9. fx2n4ad模块中文手册_三菱PLC特殊功能模块FX2N-4AD实用程序讲解
  10. android平板电脑的虚拟键盘,苹果平板电脑ipad虚拟键盘介绍 ipad虚拟键盘使用方法【详解】...
  11. smss,lsass, http://laji.xrlyy.com病毒处理
  12. Node.js版-七夕无事,人艰勿拆,求别说...
  13. 《蔡康永的说话之道》-[中]蔡康永
  14. java下载basic_Java-basic(1)
  15. 计算机用户名和密码在哪个文件夹,登陆邮箱、论坛等的帐号和密码存放在电脑中的哪个文件夹中?...
  16. 如何将ios键盘返回由英文设置成中文
  17. 2022年,送给程序员的运动健身知识
  18. Google advertiser api开发概述——入门指南
  19. appcan.frame.open打开的浮空窗口页面不开启弹动的情况下,也会有微微的滑动bug...
  20. 查看HDFS文件系统数据的三种方法

热门文章

  1. 删库跑路大神的一生:曾在家造炸弹被捕,现卖房押宝NFT,原是开源创业之星...
  2. Waymo无人车高层动荡:CFO今日也走了,半年已失8名高管
  3. 「树莓派+1万块乐高」打造乐高分类器,树莓派官方转发,网友:我想借来用两天...
  4. 一路撑起支付宝的OceanBase数据库,背后究竟有哪些杀手锏?| 云·创课程报名
  5. 用飞桨做自然语言处理:神经网络语言模型应用实例
  6. jQuery操作input
  7. iOS开发之设计模式篇
  8. 360浏览器、chrome开发扩展插件教程(2)为html添加行为
  9. SSE eventSource简介
  10. maven scala plugin 实现jvmArgs,执行过程原理解析笔记