SpringMVC的拦截器
SpringMVC的拦截器
拦截器 : Interceptor
Spring MVC 的拦截器类似于Servlet 开发中的过滤器Filter,用于对Controller进行预处理和后处理。
使用SpringMVC拦截器步骤:
1)定义拦截器类,实现接口 org.springframework.web.servlet.HandlerInterceptor
2)在applicationContext.xml中配置拦截器
拦截器方法的执行时机:
1):preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截).
2):postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息).
3):afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等)
自定义拦截器
public class CheckLoginInterceptor implements HandlerInterceptor {
//1):preHandle:控制器方法执行之前执行,返回结果为true表示放行,如果返回为false,表示拦截(可以做权限拦截,登录检查拦截).
// true : 放行 false :不放行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("拦截器执行了......");
//从Session中获取登录信息
String username = (String)request.getSession().getAttribute("username");
System.out.println(username);
if(username !=null) {
//放行
return true;
}else {
//跳转到登录页面去
response.sendRedirect(request.getContextPath()+"/login.jsp");
return false;
}
}
//postHandle:控制器方法执行后,视图渲染之前执行(可以加入统一的响应信息).
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
}
//afterCompletion:视图渲染之后执行(处理Controller异常信息,记录操作日志,清理资源等
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
}
}
拦截器的配置的配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
">
<!-- 配置springmvc的注解驱动 -->
<mvc:annotation-driven/>
<!-- 配置拦截器 :可以有多个拦截器-->
<mvc:interceptors>
<!--配置检查登录拦截器 -->
<mvc:interceptor>
<!-- 配置拦截的规则
只会拦截 控制器请求,不会拦截jsp页面
/*
只能拦截一级 如 : /list.do /delete.do
如:/user/list.do , /user/delete.do 二级 不能拦截
/**
可以拦截多级 无论几级都可以 如 /a/b/c/d/list.do
-->
<mvc:mapping path="/**"/>
<!-- 排除拦截的地址,多个地址使用逗号隔开
/user/login.do
-->
<mvc:exclude-mapping path="/user/login.do"/>
<!-- 拦截器的类型 -->
<bean class="cn.zj.ssm.interceptor.CheckLoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
</beans>
SpringMVC 控制器 Controller的生命周期
Spring 容器创建的对象默认 都是单例 对象
SpringMVC对象 Controller的对象的创建有三种情况
Request : 在用户的一次请求中生效(用户每次请求都会创建Controller对象)多例
Session : Controller对象在一次会话中创建一个对象
如果控制器中有成员变量 设置或者赋值操作,必须使用 request 返回