9.springMVC中的拦截器
springMVC中的拦截器大概大致可以分为以下几个步骤去学习:
1.自定义一个类实现HandlerInterceptor接口,这里要了解其中几个方法的作用
2.在springMVC的配置文件中添加拦截器的配置
3.了解多个拦截器的执行过程
4.写一个拦截器的demo
1.先来看第一步:自定义一个类实现HandlerInterceptor接口,其中接口中的几个方法和注解我直接贴代码
public class HandlerInterceptor1 implements HandlerInterceptor{
@Override
//执行Handler完成执行该方法
//统一的异常处理,统一的日志处理
public void afterCompletion(HttpServletRequest arg0,
HttpServletResponse arg1, Object arg2, Exception arg3)
throws Exception {
System.out.println("HandlerInterceptor1.......afterCompletion");
}
@Override
//进入Handler之后,返回ModelAndView之前
//从ModelAndView出发:将一些公共的模型数据传到视图,也可以在这里统一制定视图
//菜单的导航
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
System.out.println("HandlerInterceptor1.......postHandle");
}
@Override
//进入Handler之前执行
//用于身份认证和身份授权
//比如身份认证,如果身份认证没有通过表示该用户没有登录,需要次方法不再向下执行
public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2) throws Exception {
System.out.println("HandlerInterceptor1.......preHandle");
return false;
}
}
2.第二步在springMVC的配置文件中添加拦截器的配置其中<bean class="com.etc.interceptor.Interceptor1"></bean>是你自定义拦截器的路径(包名+类名)
拦截器可以配置多个,以下我只是简单配置了两个拦截器
<!-- 拦截器的配置 -->
<mvc:interceptors>
<!-- 如果有配置多个拦截器,按照顺序执行 -->
<mvc:interceptor>
<!-- 拦截的路径:/**表示所有的url包括子url -->
<mvc:mapping path="/**"/>
<bean class="com.etc.interceptor.Interceptor1"></bean>
</mvc:interceptor>
<mvc:interceptor>
<!-- 拦截的路径:/**表示所有的url包括子url -->
<mvc:mapping path="/**"/>
<bean class="com.etc.interceptor.Interceptor2"></bean>
</mvc:interceptor>
</mvc:interceptors>
3.了解拦截器的执行过程
测试1:两个拦截器同时放行(把两个preHandle方法的放回值设置成true)
运行结果:

分析结果:
都放行的情况下:preHandle顺序执行,postHandle,afterCompletion是逆序执行
测试2:第一个放行,第二个不放行(第一个拦截器的preHandle的返回值设置成true,第二个false)
运行结果

分析结果:
拦截器1放行,2不放行:只有拦截器1的preHandle放行,2的preHandle才会执行
拦截器2不放行:拦截器2的postHandle,afterCompletion方法就都不执行
就是只要有一个拦截器不放行:postHandle方法就都不执行
测试3:拦截器1,2都不放行(第一个和第二个拦截器的preHandle的返回值都设置成false)
运行结果:

分析结果:
就是拦截器1不放行:那么2他是根本不执行
4.写一个拦截器的demo(以登录拦截为例子):当你发起一个请求的时候,会被拦截器拦截,判断你是否登录,如果你登录,就继续执行,如果没有登录,就跳转到登录的页面让你先登录。
看看步骤是怎么样的:
1.用户发起请求l
2.拦截器进行拦截(对url进行拦截)
进行判断如果用户的session存在,放行
如果用户session不存在,然他跳转到登录的页面
3.有一些地址是不能拦截(公开地址),就是不需要登录也能访问的url,如果是这个地址也要放行。(对于这些公开地址我们应该在配置文件中体现)
如果对公开地址还是不了解的话:你可以想一下,如果你对登录也拦截是不是这辈子都别想登录成功(登录就是一个公开地址)
来看看代码吧:
1.首先你需要在自定义的拦截器类中定义一个集合存放公开地址,因为公开地址可能不止一个(get,set方法记得生成)
private List<String> unCheckUrl;
2.你要在拦截器的配置文件中把公开地址配置进去(有多个的话,在list中补充value就好)
<!-- 拦截器的全局配置 -->
<mvc:interceptors>
<!-- 多个拦截器顺序执行 -->
<mvc:interceptor>
<!-- /**:表示拦截所有的url包括子url /*只拦截根url -->
<mvc:mapping path="/**" />
<bean class="com.etc.interceptor.LoginInterceptor">
<property name="unCheckUrl">
<list>
<value>/springmvc_demo/login</value>
</list>
</property>
</bean>
</mvc:interceptor>
</mvc:interceptors
3.在preHandle方法中编写你的处理逻辑
//进入Handler之前执行
//用于身份认证和身份授权
//比如身份认证,如果身份认证没有通过表示该用户没有登录,需要次方法不再向下执行
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object arg2) throws Exception {
//获取请求的url
String url = request.getRequestURI();
//公开的通过就是对公开地址不进行拦截
for(String uri:unCheckUrl){
if(url.contains(uri)){
return true;
}
}
//从session中取出用户的身份进行验证
HttpSession session =request.getSession();
String username=(String) session.getAttribute("username");//如果在session中有取到用户名,说明已经登录,也方向
if(username!=null){
//已经登录,放行
return true;
}
request.getRequestDispatcher("/WEB-INF/view/login.jsp").forward(request, response);//没有取到的话,就跳转到登录页面
return false;
}
9.springMVC中的拦截器的更多相关文章
- SpringMVC中的拦截器、过滤器的区别、处理异常
1. SpringMVC中的拦截器(Interceptor) 1.1. 作用 拦截器是运行在DispatcherServlet之后,在每个Controller之前的,且运行结果可以选择放行或拦截! 除 ...
- 【SpringMVC学习11】SpringMVC中的拦截器
Springmvc的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理.本文主要总结一下springmvc中拦截器是如何定义的,以及测试拦截器的执行情况和使用 ...
- (转)SpringMVC学习(十二)——SpringMVC中的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/72567761 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter, ...
- SpringMvc中Interceptor拦截器用法
SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理.比如通过它来进行权限验证,或者是来判断用户是否登陆等. 一. 使用场景 1 ...
- SpringMVC中的拦截器
1. 自定义拦截器 实现HandlerInterceptor接口 拦截器一: package cn.rodge.ssm.interceptor;import javax.servlet.http.Ht ...
- springmvc中的拦截器interceptor用法
1.配置拦截器 在springMVC.xml配置文件增加: 1 <mvc:interceptors> 2 <!-- 日志拦截器 --> 3 <mvc:intercepto ...
- springMvc中实现拦截器Interceptor以及添加静态资源映射
这个代码写了很久了,多久呢?2018年12-20号写的.... 废话不多说,简化一下,作为笔记. 注: public class springmvcConfig extends WebMvcConfi ...
- springmvc中配置拦截器
-------------------------------------------- 登陆controller方法 @Controller public class LoginController ...
- SpringMVC 学习笔记(拦截器的配置))
在设置SpringMVC的拦截器时,需要在SpringMVC中配置 拦截器对象,拦截器的的对象要 实现 HandlerInterceptor 接口 拦截器类的设置: public class inte ...
随机推荐
- For xml path
Select * from tb for xml path('') 特点: 1. 以xml形式展示查询数据. 2. 自定义数据展示类型. 实例: 1. Select * from tb for xml ...
- 2016HUAS_ACM暑假集训2J - 今年暑假不AC
简单的贪心题.把节目的结束时间按升序排列,从第一个节目开始,寻找可以完全看完的节目. 这里用了结构体,所以要自己写排序方式. 总之,贪心的第一要义就是——排序! 本人新手,请体谅. #include& ...
- (转)【重磅】无监督学习生成式对抗网络突破,OpenAI 5大项目落地
[重磅]无监督学习生成式对抗网络突破,OpenAI 5大项目落地 [新智元导读]"生成对抗网络是切片面包发明以来最令人激动的事情!"LeCun前不久在Quroa答问时毫不加掩饰对生 ...
- 使用APC缓存PHP opcode
1. 关于版本 我的php版本是5.3.10 最开始使用 APC-3.1.8 编译成功,但是 php -m 得不到扩展 , 换成 APC-3.1.9 后解决. 2. 关于配置 apc.cac ...
- python检测字符串的字母
python3判断字符串内是否含有字母,并打印字母出来 # !/usr/bin/python3.4 # -*- coding: utf-8 -*- import re a = "8a2656 ...
- Google 的开源技术protobuf 简介与例子
本文来自CSDN博客:http://blog.csdn.NET/program_think/archive/2009/05/31/4229773.aspx 今天来介绍一下"Protocol ...
- 互斥锁(Mutex)
互斥锁(Mutex)互斥锁是一个互斥的同步对象,意味着同一时间有且仅有一个线程可以获取它.互斥锁可适用于一个共享资源每次只能被一个线程访问的情况 函数://创建一个处于未获取状态的互斥锁Public ...
- python(23)re函数:compile、match、search、findall
正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re 模块使 Python ...
- (转)JPEG图片数据结构分析- 附Png数据格式详解.doc
一.简述 JPEG是一个压缩标准,又可分为标准JPEG.渐进式JPEG及JPEG2000三种: ①标准JPEG:以24位颜色存储单个光栅图像,是与平台无关的格式,支持最高级别的压缩,不过,这种压 ...
- oracle两列相同的去重
源地址:https://zhidao.baidu.com/question/66722841.html 1.不含大字段(clob等)的表格: 1 2 3 4 5 6 7 8 9 --例子表格:crea ...