1.DispatcherServlet

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

 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里配置如下代码即可:)

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属性显示指定:

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

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

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,

 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”,具体代码如下:

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

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

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

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

转载于:https://www.cnblogs.com/sharpest/p/5339334.html

11. SpringMVC拦截器(资源和权限管理)相关推荐

  1. SpringMVC拦截器-用户登录权限控制代码实现1

    判断用户是否登录 本质:判断session中有没有user,如果没有登陆则先去登陆,如果已经登陆则直接放行访问目标资源 先编写拦截器如下: public class PrivilegeIntercep ...

  2. SpringMVC拦截器-用户登录权限控制代码实现2

    在登陆页面输入用户名密码,点击登陆,通过用户名密码进行查询,如果登陆成功,则将用户信息实体存入session,然后跳转到首页,如果登陆失败则继续回到登陆页面 在UserController中编写登陆逻 ...

  3. SpringMVC拦截器-用户登录权限控制代码实现3

    JdbcTemplate.queryForObject对象如果查询不到数据会抛异常,导致程序无法达到预期效果,如何来解决该问题? 在业务层处理来自dao层的异常,如果出现异常service层返回nul ...

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

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

  5. 在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案

    在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 参考文章: (1)在JSP中常见问题,防止SpringMVC拦截器拦截js等静态资源文件的解决方案 (2)https: ...

  6. Java Servlet 过滤器与 springmvc 拦截器的区别?

    前言:在工作中,遇到需要记录日志的情况,不知道该选择过滤器还是拦截器,故总结了一下. servlet 过滤器 定义 java过滤器能够对目标资源的请求和响应进行截取.过滤器的工作方式分为四种 应用场景 ...

  7. 在拦截器里放入参数 controller_干货|SpringMVC拦截器的使用详解

    一.拦截器简介 Spring MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理. 常见应用场景 1.日志记录:记录请求信息的日志,以便进行信息监控.信 ...

  8. SpringMVC拦截器HandlerInterceptor原理及使用

    在使用SpringMVC拦截器的时候,我们接触的最多的便是HandlerInterceptor接口,因为我们所有的自定义拦截器都必须要实现HandlerInterceptor接口,那么就先从Handl ...

  9. 跨域请求/SpringMVC拦截器

    <!-- 开启允许跨域 --> <mvc:cors> <mvc:mapping path="/**"/> </mvc:cors> S ...

  10. SpringMVC拦截器与Filter过滤器

    SpringMVC拦截器与Filter过滤器 SpringMVC拦截器与Filter过滤器 Spring MVC拦截器的定义 SpringMVC拦截器的配置 SpringMVC拦截器HandlerIn ...

最新文章

  1. 云端卫士DDoS防护解决方案助力互联网金融安全
  2. Linux 内核的一个问题
  3. DDR读写简介及相关
  4. 你能活多少岁,就让人工智能来告诉你吧
  5. 【译】Three Security Trends Are Key to Decentralize Artificial Intelligence
  6. MongoDB学习笔记(二)使用Java操作MongoDB
  7. 人脸登陆facelogin
  8. django-rest-framework第一次使用使用常见问题
  9. xshell 6 连接debian系统拒绝了密码_原来连接Linux,还有这个方法
  10. linux命令行 基础,Linux命令行基础,关于Bash需要知道的一些常识
  11. MACOSX下查看某个端口被哪个程序占用及杀进程方法
  12. 如何查看数据库是否是rac,如何查看数据库是否是单实例
  13. java语句电脑定时关机_月光软件站 - 编程文档 - Java - windows定时关机程序
  14. spring boot 多数据源分布式事务处理
  15. 【Allwinner】---搭建 全志平台 开发环境 史上最详细
  16. 超大箱船面临改变 投入福州到泉州专线
  17. 利用Github服务器做一个软件自动升级系统
  18. 计算机桌面文件删除不掉是怎么了,桌面上文件删不掉_桌面上的压缩文件为什么删除不了?...
  19. 免费小说阅读小程序,仿番茄小说源码;微信小说小程序源码
  20. python中script什么意思_如何用通俗易懂的语言解释脚本(script)是什么?

热门文章

  1. Java8 Stream 流使用场景和常用操作
  2. 04-07递归解法问题
  3. 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) B - Enlarging Enthusiasm dp好题
  4. hihoCoder - 1075 开锁魔法III
  5. php模拟顺序栈基本操作
  6. Android系统自带样式(@android:style/) (转)
  7. 第五话 Asp.Net MVC 3.0【MVC实战项目の一】
  8. 【练习】Java实现的杨辉三角形控制台输出
  9. request库的基本使用
  10. [转载]for循环的执行顺序