前言:Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对处理器进行预处理和后处理。
1、拦截器的定义
实现HandlerInterceptor接口
Public class HandlerInterceptor1 implements HandlerInterceptor{
/**
* controller执行前调用此方法
* 返回true表示继续执行,返回false中止执行
* 这里可以加入登录校验、权限拦截等
*/
@Override
Public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
// TODO Auto-generated method stub
Return false;
}
/**
* controller执行后但未返回视图前调用此方法
* 这里可在返回用户前对模型数据进行加工处理,比如这里加入公用信息以便页面显示
*/
@Override
Public void postHandle(HttpServletRequest request,
HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// TODO Auto-generated method stub
}
/**
* controller执行后且视图返回后调用此方法
* 这里可得到执行controller时的异常信息
* 这里可记录操作日志,资源清理等
*/
@Override
Public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object handler, Exception ex)
throws Exception {
// TODO Auto-generated method stub
}
}
2、拦截器在的配置Springmvc.xml
<!-- 配置拦截器 -->
<mvc:interceptors>
<!-- 多个拦截器的执行顺序等于springMvc.xml中的配置顺序 -->
<!-- <mvc:interceptor> -->
<!-- 拦截请求的路径 要拦截所有必需配置成/** -->
<!-- <mvc:mapping path="/**"/> -->
<!-- 指定拦截器的位置 -->
<!-- <bean class="cn.itheima.interceptor.Interceptor1"></bean> -->
<!-- </mvc:interceptor> -->
<!-- <mvc:interceptor> -->
<!-- 拦截请求的路径 要拦截所有必需配置成/** -->
<!-- <mvc:mapping path="/**"/> -->
<!-- 指定拦截器的位置 -->
<!-- <bean class="cn.itheima.interceptor.Interceptor2"></bean> -->
<!-- </mvc:interceptor> -->
<mvc:interceptor>
<!-- 拦截请求的路径 要拦截所有必需配置成/** -->
<mvc:mapping path="/**"/>
<!-- 指定拦截器的位置 -->
<bean class="cn.itheima.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
3、拦截器的应用,用户身份的拦截
3.1 Controller层
package cn.chuantao.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@RequestMapping("/login")
@Controller
public class UserController {
@RequestMapping("/login")
public String login(){
return "login";
}
@RequestMapping("/submit")
public String submit(String username,String password,HttpServletRequest request){
if(username!=null && username.trim()!=""){
request.getSession().setAttribute("username", username);
}
return "redirect:/list.action";
}
}
3.2 jsp 页面
<form action="${pageContext.request.contextPath }/login/submit.action" method="post">
<table>
<tr><td>用户名:<input name="username" type="text"/></td></tr>
<tr><td>密码:<input name="password" type="text"/></td></tr>
<tr><td><input value="登录" type="submit"/></td></tr>
</table>
</form>
3.3 拦截器类
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse arg1, Object arg2) throws Exception {
// 判断是否是login登录页面,若果是则放行
if(request.getRequestURI().indexOf("login")!=-1){
return true;
}
// 判断session中是否含有对象,如果含有则放行
if(request.getSession().getAttribute("username")!=null){
return true;
}
// 其余情况返回false
return false;
}