工作中,我们肯定都会接触到拦截器,但是经常在拦截的过程中出现各种问题,比如拦截之后,静态资源也被拦截,结合AOP的时候起不到作用,或者拦截根本没有生效。用SpringMVC的小伙伴肯定深有感受,接下来,我们一起整理一遍拦截器及AOP。
1.什么是拦截器
在SpringMVC中用于拦截请求的代码。由于SpringMVC的视图解析器的存在,在拦截请求到处理请求再到返回视图中间有两个间隙,interceptor提供了preHandle和postHandle以及afterCompletion三个方法。preHandle调用controller具体方法之前调用,postHandle完成具体方法之后调用,afterCompletion完成对页面的render以后调用,至此整个页面渲染完成。也就是说我们在preHandle记录开始的时间,在afterCompletion记录结束的时间,就可或者整个页面生成的时间。
2.步骤和流程
步骤:
第一步:自定义一个实现了Interceptor接口的类,或者继承抽象类AbstractInterceptor。这里继承了HandlerInterceptor接口
第二步:在配置文件中注册定义的拦截器。
第三步:在需要使用Controller中编写业务逻辑
接下来就看具体实践:
3.具体实现
1 自定义拦截器类,实现HandlerInterceptor接口
2 实现preHandle方法,此处校验的是app_id和app_secret是否合法
3 在configuration类中注册拦截器,定义生效的规则
4 编写Controller代码
接下来就简单Demo一个例子:使用Spring5.x
1.导包:
2.配置web.xml,只需要配置一个分发器就行了:
3.写controller和interceptor拦截器
HandlerInterceptor其实一共3个方法,都是默认方法,需要Ctrl进去方法里面copy出来即可。
4.配置applicationContext.xml
注意事项:目录结构必须正确,applicationContext.xml文件需要放在src的根目录下,不能随意摆放,否则就会报找不到文件的错误。
可以配置多个<mvc:interceptor>,然后会按顺序去拦截
5.验证并给出结论:
输入URL:http://localhost/thisisturemethod.action
打印的日志为:
验证了我们的结论,确实拦截了,那另一个我没有配置的方法会不会被拦截呢?
执行下:http://localhost/thisisfalse.action
打印日志为:
确实没有被拦截,如果没有配置就不会被拦截,这样也实现了方法拦截的效果!!
但是还有一个点肯定很疑惑,perhandler里面request和response参数都好理解,但是还有一个Object handler参数,这是什么东西呢?
输出之后我们发现,就是方法的全名:
这些还是不够,因为我return true;就会进入方法执行,但是return false我会跳到哪里去呢???
这个时候就会根据response来产生响应,如果response没有东西,那么返回的response就是null,但是如果response里面加入了需要的参数,就会返回response给到前端渲染失败之后的界面,所以需要看前端需要什么数据,比如Map,String,一般都是这些:
List<HashMap<String, Object>> mapList= new ArrayList<HashMap<String, Object>>();
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json;charset=UTF8");
PrintWriter writer = response.getWriter();
writer.write(JSON.toJSONString(mapList));
writer.close();
主要是要设置一下报文头的返回格式application/json,就可以指定返回的格式了。
希望这对你有帮助,更进一步了解SpringMVC的拦截