Spring mvc之拦截器介绍

Stella981
• 阅读 508

一、拦截器介绍 

============

(1)拦截器概念介绍

        拦截器(Interceptor)是Spring的核心功能之一,它可以在用户请求Action的之前或之后进行一些业务处理。

        很多从ASP.NET转过来的开发人员把它叫做过滤器。

(2)拦截器方法执行顺序

        按照拦截器的执行前后顺序依次为:preHandle、postHandle、afterCompletion。

        preHandle:该方法将在请求处理之前执行。

        postHandle:该方法在Action执行后,DispatcherServlet返回视图之前执行。

        afterCompletion:该方法在整个请求结束之后执行,这个方法主要作用是用于资源清理工作。

(3)拦截器的类型

        拦截器按照拦截范围,分为全局拦截器和局部拦截器。

        全局拦截器拦截所有请求,局部拦截器只拦截特定请求。

二、开发拦截器步骤


(1)定义拦截器实现类

        首先定义一个拦截器的实现类。

(2)实现拦截接口

        HandlerInterceptor接口或WebRequestInterceptor接口,任意实现一个接口都可以,这两个接口都包括三个方法:preHandle、postHandle、afterCompletion。

        我们可以根据实际情况做不同的实现。

(3)注册拦截器

注册全局拦截器

<mvc:interceptors>
     <bean class="包名.拦截器实现类的类名" />
</mvc:interceptors>

注册局部拦截器

<mvc:interceptors>
    <mvc:interceptor>
      <mvc:mapping path="/Controller/action">
      <bean class="包名.类名" />
      </mvc:mapping>
     </mvc:interceptor>
</mvc:interceptors>

三、实现注解式权限验证步骤

=================

        在Spring MVC中,可以通过在Action方法上加拦截器注解的方式来确定是否拦截。这种应用很普遍。

        接下来我们来实现这种应用。

(1)添加自定义注解

package com.uni2uni.interceptor;
 
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Inherited;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
 
@Documented
@Inherited
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Auth {
 boolean validate() default true;
}

(2)实现自定义拦截器

package com.uni2uni.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class AuthInterceptor extends HandlerInterceptorAdapter {
 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        
        if(handler.getClass().isAssignableFrom(HandlerMethod.class)){
            AuthPassport authPassport = ((HandlerMethod) handler).getMethodAnnotation(AuthPassport.class);
            
            //没有声明注解,或者声明不验证权限
                if(authPassport == null || authPassport.validate() == false)
                return true;
            else{                
                //在这里实现自己的权限验证逻辑
                if(false)//如果验证成功返回true(这里直接写false来模拟验证失败的处理)
                    return true;
                else//如果验证失败
                {
                    //返回到登录界面
                    response.sendRedirect("account/login");
                    return false;
                }       
            }
        }
        else
            return true;   
     }
}

(3)注册自定义拦截器

        springMVC.xml中配置拦截器代码如下所示:

<mvc:interceptors>   
  <!-- 国际化操作拦截器 如果采用基于(请求/Session/Cookie)则必需配置 -->  
  <bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />   
  <!-- 如果不定义 mvc:mapping path 将拦截所有的URL请求 --> 
  <bean class="com.uni2uni.interceptor.AuthInterceptor"></bean> 
</mvc:interceptors>

(4)在Action上添加拦截器注解

 @AuthPassport
 @RequestMapping(value={"/demo1-post"})
 public ModelAndView demo1(){
  ModelAndView modelAndView= new ModelAndView();
  modelAndView.setViewName("demo1-post");

  return modelAndView;
 }

四、Demo下载

============

        本Demo实现了一个简单的自定义拦截器,如下图所示:

        Spring mvc之拦截器介绍

        Demo下载:http://pan.baidu.com/s/1eQd4SD0

五、知识扩展    

==============

(1)拦截器执行顺序

        拦截器是执行是按照配置的先后顺序执行的。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Easter79 Easter79
2年前
spring—拦截器
1.拦截器进行登录检查/登陆检查///拦截器要注册到容器中publicclassLoginHandlerInterceptorimplementsHandlerInterceptor{//目标方法执行之前@Overridepublic
Easter79 Easter79
2年前
springboot学习笔记2(拦截器,redis,授权登录,读取yml配置文件)
介绍一下springboot的一些自定义配置。自定义配置前,需要加入一些依赖,在学习笔记1中都要介绍1.使用springboot自定义拦截器。 首先自己一个拦截器:publicclassMyInterceptorimplementsHandlerInterceptor{@Override
Stella981 Stella981
2年前
Mybatis拦截器
1.介绍:   我自己理解中的mybatis拦截器,和普通拦截器一样,在执行一段程序之前对其做一些特殊处理,网上一般都是用其做分页处理、日志记录...,实现原理就是在预处理前对其进行一些处理2.简单说明:  mybatis提供了一个Interceptor接口,方便扩展所需的操作  Object intercept(Invocation in
Easter79 Easter79
2年前
SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景
本文源码GitHub:知了一笑https://github.com/cicadasmile/springbootbase一、拦截器简介1、拦截器定义拦截器,请求的接口被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。拦截器主要用来按照指定规则拒
Stella981 Stella981
2年前
SpringBoot2.0 基础案例(05):多个拦截器配置和使用场景
本文源码GitHub:知了一笑https://github.com/cicadasmile/springbootbase一、拦截器简介1、拦截器定义拦截器,请求的接口被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。拦截器主要用来按照指定规则拒
Easter79 Easter79
2年前
SSM框架项目的mvc拦截器
为了防止用户在不登录的情况下通过并接请求直接访问系统,我们需要通过session和拦截器来防止这样的情况。拦截器的配置:为拦截器建立一个包:interceptor,并在包里建立LoginInterceptor拦截器类!(https://oscimg.oschina.net/oscnet/0c550371593ccb1aa7a33fa7b7
Stella981 Stella981
2年前
SSM框架项目的mvc拦截器
为了防止用户在不登录的情况下通过并接请求直接访问系统,我们需要通过session和拦截器来防止这样的情况。拦截器的配置:为拦截器建立一个包:interceptor,并在包里建立LoginInterceptor拦截器类!(https://oscimg.oschina.net/oscnet/0c550371593ccb1aa7a33fa7b7
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这