什么是拦截器?
--spring提供的一个特殊的组件,当DispatcherServlet收到请求之后,如果有拦截器,会先调用拦截器,然后调用相应的处理器(Controller).
注: 过滤器属于servlet规范,而拦截器属于spring框架。
如何写一个简单的hello拦截器
step1. 写一个java类,实现HanderlerInterceptor接口。
step2. 实现具体的拦截处理逻辑,比如,session验证。(这里是拦截一个hello.jsp)
public class SomeInterceptor implements HandlerInterceptor{
/**
* 最后执行的方法
* 注意:只有当preHandle方法返回值为true时,该方法才会执行
* ex:是处理器所抛出的异常,可以写一个拦截器,用来处理这些异常
*/
public void afterCompletion(HttpServletRequest req,
HttpServletResponse res,
Object arg2,
Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
/**
* 处理器(Controller)的方法已经执行完毕,正准备将处理结果(ModelAndView)对象
* 返回给DispatcherServlet之前执行postHandle方法。可以在该方法里面,修改处理结果。
*/
public void postHandle(HttpServletRequest arg0,
HttpServletResponse arg1,
Object arg2,
ModelAndView arg3)
throws Exception {
System.out.println("postHandle()");
// TODO Auto-generated method stub
}
/**
* DispatcherServlet收到请求之后,会先调用preHandler方法。如果该方法的
* 返回值是true,则继续向后调用;
* 如果返回值是false,则不再向后调用了。
* arg2:描述处理器方法的一个对象。
*/
public boolean preHandle(
HttpServletRequest arg0,
HttpServletResponse arg1,
Object arg2) throws Exception {
System.out.println("preHandle()");
return true;
}
}
Controller 里面的内容
package controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class HelloController {
@RequestMapping("/hello.do")
public String hello() {
System.out.println("hello");
return "hello";
}
@RequestMapping("/demo/hello2.do")
public String hello2() {
System.out.println("hello2()");
return "hello";
}
}
step3.配置拦截器。(spring-mvc.xml中)
<!-- 配置拦截器
如果有多个拦截器,会按照配置的先后顺序来执行
-->
<mvc:interceptors>
<mvc:interceptor>
<!-- 如果地址 是分层的就用/** -->
<mvc:mapping path="/**"/>
<!--可以加上要排除的访问路例: 排队进登录页面 <mvc:exclude-mapping path="/toLogin.do"/><mvc:exclude-mapping path="/login.do"/> -->
<bean class="interceptors.SomeInterceptor">
</bean>
</mvc:interceptor>
</mvc:interceptors>