springmvc 拦截器 - 哎幽的成长 - CSDN博客
http://blog.csdn.net/u012373815/article/details/47208565

拦截器的机制是属于 AOP的

1.1
定义

Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。

1.2
拦截器定义

实现
HandlerInterceptor
接口,如下:

Public class HandlerInterceptor1 implementsHandlerInterceptor{/*** controller执行前调用此方法
* 返回true表示继续执行,返回false中止执行
* 这里可以加入登录校验、权限拦截等
*/@Override
Public
booleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throwsException {//TODO Auto-generated method stub Return false;
}
/*** controller执行后但未返回视图前调用此方法
* 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
*/@Override
Public
voidpostHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView)
throwsException {//TODO Auto-generated method stub }/*** controller执行后且视图返回后调用此方法
* 这里可得到执行controller时的异常信息
* 这里可记录操作日志,资源清理等
*/@Override
Public
voidafterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throwsException {//TODO Auto-generated method stub }

}

1.3
拦截器配置

1.3.1
针对某种
mapping
配置拦截器

<beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <propertyname="interceptors">
        <list>
            <refbean="handlerInterceptor1"/>
            <refbean="handlerInterceptor2"/>
        </list>
    </property>
</bean>
    <beanid="handlerInterceptor1"class="springmvc.intercapter.HandlerInterceptor1"/>
    <beanid="handlerInterceptor2"class="springmvc.intercapter.HandlerInterceptor2"/>

1.3.2
针对所有
mapping
配置全局拦截器

<!--拦截器-->
<mvc:interceptors>//类似MVC注解驱动的标签<!--多个拦截器,顺序执行-->
    <!--登陆认证拦截器-->
    <mvc:interceptor>
        <mvc:mappingpath="/**"/>
        <beanclass="cn.itcast.ssm.interceptor.LoginInterceptor"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <!--/**表示所有url包括子url路径-->
        <mvc:mappingpath="/**"/>//如果只有一个 /*只会执行最根的那层url<beanclass="cn.itcast.ssm.interceptor.HandlerInterceptor1"></bean>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mappingpath="/**"/>
        <beanclass="cn.itcast.ssm.interceptor.HandlerInterceptor2"></bean>
    </mvc:interceptor>
</mvc:interceptors>


正常流程测试

1.1.1
代码:

定义两个拦截器分别为:
HandlerInterceptor1

HandlerInteptor2
,每个拦截器的
preHandler
方法
都返回

true

1.1.2
运行流程

HandlerInterceptor1..preHandle..
HandlerInterceptor2..preHandle..

HandlerInterceptor2..postHandle..
HandlerInterceptor1..postHandle..

HandlerInterceptor2..afterCompletion..
HandlerInterceptor1..afterCompletion..

1.2
中断流程
测试

1.2.1
代码:

定义两个拦截器分别为:
HandlerInterceptor1

HandlerInteptor2

1.2.2
运行流程

HandlerInterceptor1

preHandler
方法返回
false

HandlerInterceptor2
返回
true

运行流程如下

HandlerInterceptor1..preHandle..

从日志看出第一个拦截器的
preHandler
方法返回
false
后第一个拦截器只执行了
preHandler
方法,其它两个方法没有执行,第二个拦截器的所有方法不执行,且
controller
也不执行了。

HandlerInterceptor1

preHandler
方法返回
true

HandlerInterceptor2
返回
false

运行流程如下

HandlerInterceptor1..preHandle..

HandlerInterceptor2..preHandle..

HandlerInterceptor1..afterCompletion..

从日志看出第二个拦截器的
preHandler
方法返回
false
后第一个拦截器的
postHandler
没有执行,第二个拦截器的
postHandler

afterCompletion
没有执行,且
controller
也不执行了。

总结:
preHandle按拦截器定义顺序调用
postHandler按拦截器定义逆序调用
afterCompletion按拦截器定义逆序调用

postHandler在拦截器链内所有拦截器返成功调用
afterCompletion只有preHandle返回true才调用

1.3
拦截器应用

1.3.1
用户身份认证

Public class LoginInterceptor implementsHandlerInterceptor{

@Override
Public
booleanpreHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throwsException {//如果是登录页面则放行
if(request.getRequestURI().indexOf("login.action")>=0){return true;
}
HttpSession session
=request.getSession();//如果用户已登录也放行
if(session.getAttribute("user")!=null){return true;
}
//用户没有登录挑战到登录页面
request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);return false;
}

1.3.2
用户登陆
controller

//登陆提交//userid:用户账号,pwd:密码
@RequestMapping("/login")public String loginsubmit(HttpSession session,String userid,String pwd)throwsException{//向session记录用户身份信息
session.setAttribute("activeUser", userid);return "redirect:item/queryItem.action";
}
//退出
@RequestMapping("/logout")public String logout(HttpSession session)throwsException{//session过期
session.invalidate();return "redirect:item/queryItem.action";
}

《17springmvc拦截器-实现登陆认证.avi》课程的18分处 处理中文乱码,提交为什么改成post就不会有乱码了呢??

标签: none

添加新评论