Spring 配置拦截器 HandlerInterceptor

目录

1、Spring基础环境搭建(略)

2、过滤器类实现 HandlerInterceptor 接口

3、mvc:interceptors 配置

4、拦截器访问顺序

5、看看我们的测试方法-线程暂停1000毫秒

6、实验打印结果

7、执行顺序

过滤器-拦截器(preHandle方法)-被调用程序运行结束-拦截器(postHandle方法)-拦截器(afterCompletion方法)

8、延伸阅读-使用拦截器或者过滤器修改 request 的参数值

9、获取所有的入参


1、Spring基础环境搭建(略)

2、过滤器类实现 HandlerInterceptor 接口

不要对里面的 maxSize 参数感到奇怪,他是可有可无的,其来自于xml配置中配置的参数,看下一步

preHandle return false 时程序就会中止

如果想要页面跳转到一个单独到页面可以

response.sendRedirect(request.getContextPath() + "/路径");
return false;

 

package com.bestcxx.stu.fileup.intercepter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.servlet.ServletRequestContext;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {
	private long maxSize;

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		System.out.println(this.getClass()+" preHandle开始:"+System.currentTimeMillis());
		System.out.println(this.getClass()+" 自定义拦截器访问前:"+maxSize);
		 if(request!=null && ServletFileUpload.isMultipartContent(request)) {
	            ServletRequestContext ctx = new ServletRequestContext(request);
	            long requestSize = ctx.contentLength();
	            if (requestSize > maxSize) {
	                throw new MaxUploadSizeExceededException(maxSize);
	            }
	        }
		System.out.println(this.getClass()+" preHandle结束:"+System.currentTimeMillis());
		return true;
		
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		// TODO Auto-generated method stub
		System.out.println(this.getClass()+" postHandle开始:"+System.currentTimeMillis());
		System.out.println(this.getClass()+" 自定义拦截器访问中:"+maxSize);
		System.out.println(this.getClass()+" postHandle结束:"+System.currentTimeMillis());
		
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		System.out.println(this.getClass()+" afterCompletion开始:"+System.currentTimeMillis());
		System.out.println(this.getClass()+" 自定义拦截器访问后:"+maxSize);
		System.out.println(this.getClass()+" afterCompletion结束:"+System.currentTimeMillis());

	}

	public void setMaxSize(long maxSize) {
		this.maxSize = maxSize;
	}
	
	

}

 

3、mvc:interceptors 配置

 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"  
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xmlns:aop="http://www.springframework.org/schema/aop"  
    xmlns:util="http://www.springframework.org/schema/util"  
    xmlns:orm="http://www.springframework.org/schema/orm"   
    xmlns:mvc="http://www.springframework.org/schema/mvc"  
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd  
                        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd  
                        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.3.xsd  
                        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd  
                        http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd  
                        http://www.springframework.org/schema/orm http://www.springframework.org/schema/orm/spring-orm-4.3.xsd  
                        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd  
    ">
    <!-- 拦截器配置 -->
     <mvc:interceptors>
     	<mvc:interceptor>
     		<mvc:mapping path="/**"/>
     		<bean class="com.bestcxx.stu.fileup.intercepter.MyInterceptor">
     			<property name="maxSize" value="5000"></property>
     		</bean>
     	</mvc:interceptor>
     </mvc:interceptors>
    
</beans>

 

4、拦截器访问顺序

 

访问-过滤器-拦截器(访问前,中,后三个方法都会被调用)

 

5、看看我们的测试方法-线程暂停1000毫秒

 

@GetMapping(value="restfulGetResponseBody")
	@ResponseBody
	public AjaxRespnseModel<String> restfulGetResponseBody(){
		System.out.println(this.getClass()+" restfulGetResponseBody开始:"+System.currentTimeMillis());
		AjaxRespnseModel<String> a=new AjaxRespnseModel<String>();
		a.setResult("RESTful风格测试");
		a.setMsg("RESTful风格测试,仅仅用户测试get方法。");
		
		//线程停止1000毫秒
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		System.out.println(this.getClass()+" restfulGetResponseBody结束:"+System.currentTimeMillis());
		return a;
	}

 

 

 

6、实验打印结果

 

不要在意第一行,那个是我写的一个filter,不过可以认为,Filter是限于interceptor执行的

 

class com.bestcxx.stu.fileup.filter.MyFilter 自定义路过的filter
class com.bestcxx.stu.fileup.intercepter.MyInterceptor preHandle开始:1505445860408
class com.bestcxx.stu.fileup.intercepter.MyInterceptor 自定义拦截器访问前:5000
class com.bestcxx.stu.fileup.intercepter.MyInterceptor preHandle结束:1505445860408
class com.bestcxx.stu.fileup.controller.RestfulController restfulGetResponseBody开始:1505445860411
class com.bestcxx.stu.fileup.controller.RestfulController restfulGetResponseBody结束:1505445861411
class com.bestcxx.stu.fileup.intercepter.MyInterceptor postHandle开始:1505445861475
class com.bestcxx.stu.fileup.intercepter.MyInterceptor 自定义拦截器访问中:5000
class com.bestcxx.stu.fileup.intercepter.MyInterceptor postHandle结束:1505445861475
class com.bestcxx.stu.fileup.intercepter.MyInterceptor afterCompletion开始:1505445861475
class com.bestcxx.stu.fileup.intercepter.MyInterceptor 自定义拦截器访问后:5000
class com.bestcxx.stu.fileup.intercepter.MyInterceptor afterCompletion结束:1505445861475

 

7、执行顺序

过滤器-拦截器(preHandle方法)-被调用程序运行结束-拦截器(postHandle方法)-拦截器(afterCompletion方法)

 

8、延伸阅读-使用拦截器或者过滤器修改 request 的参数值

在实际访问中,有时候我们会遇到参数需要处理的情况,比如数字隐藏,加密解密等,这个时候需要对传递中的参数进行二次处理

使用拦截器(org.springframework.web.servlet.HandlerInterceptor)和过滤器(javax.servlet.Filter)都可以实现这个功能

 过滤器 中

 @Override
    public void doFilter(ServletRequest request, 
ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.getParameterMap().put("参数名",新值);
        chain.doFilter(request,response);
    }

拦截器中

@Override
    public boolean preHandle(HttpServletRequest request,
 HttpServletResponse response, Object handler) throws Exception {
        request.getParameterMap().put("参数名",新值);
        return true;
    }

由于本文是拦截器的,所以附上过滤器的配置-web.xml 中增加

<filter>
		<filter-name>myFilter</filter-name>
		<filter-class>**.filter.MyFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>myFilter</filter-name>
		<url-pattern>/a/b/*</url-pattern>
	</filter-mapping>


 

9、获取所有的入参

Set<String> set=request.getParameterMap().keySet();

        Iterator iterator=set.iterator();
        while(iterator.hasNext()){
            logger.info(iterator.next());
        }

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值