第八天:SpringMVC拦截器
(一)拦截器的概念
SpringMVC的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),用于对处理器进行预处理和后处理。是可以在action执行前后执行的代码。是我们做web开发时经常用的技术。比如:权限控制、日志等。我们也可以将多个Interceptor连在一起组成Interceptor栈
可以把拦截器比作是大楼的门卫,它会在你进门之前和离开之前对你进行校验
(二)拦截器的使用
1、单个拦截器使用
(1)自定义一个类实现HandleInterceptor接口,或者继承HandlerInterceptorAdaptor抽象类。
(2)实现HandlerInterceptor接口的三个方法:
preHandle() : 在目标方法之前执行,一般用于预处理
postHandle():在目标方法执行之后执行,一般用于后处理
afterCompletion():整个请求处理完毕,在视图渲染完毕时回调,一般用于资源的清理或性能的统计
(3)在配置文件中注册拦截器
<!--拦截器注册-->
<mvc:interceptors>
<mvc:interceptor>
<!--拦截器拦截的路径
/**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录
-->
<mvc:mapping path="/user/**"/>
<!--拦截器类-->
<bean class="com.offcnb.interceptors.DemoInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
2、拦截器链
开发中拦截器可以单独使用,也可以同时使用多个拦截器形成一条拦截器链。
其开发步骤和单个拦截器是一样的,只不过注册的时候注册多个,注意这里注册的顺序就代表拦截器执行的顺序
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.offcn.interceptors.DemoInterceptor"/>
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="com.offcn.interceptors.DemoInterceptor1"/>
</mvc:interceptor>
</mvc:interceptors>
这个时候需要注意拦截器的执行顺序
(三)拦截非法用户案例
1、创建拦截器
public class LoginHandlerIntercepter implements HandlerInterceptor {
@Override
public void afterCompletion(HttpServletRequest request,
HttpServletResponse response, Object arg2, Exception arg3)
throws Exception {
}
@Override
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1,
Object arg2, ModelAndView arg3) throws Exception {
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse arg1,
Object arg2) throws Exception {
String requestURI = request.getRequestURI();
if(requestURI.indexOf("editClientIfo")>0){
//说明处在编辑的页面
HttpSession session = request.getSession();
String username = (String) session.getAttribute("username");
if(username!=null){
//登陆成功的用户
return true;
}else{
//没有登陆,转向登陆界面
request.getRequestDispatcher("/login.jsp").forward(request,arg1);
return false;
}
}else{
return true;
}
}
}
2、配置拦截器
<mvc:interceptors>
<!-- 配置登陆拦截器 -->
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.offcn.interceptor.LoginHandlerIntercepter"></bean>
</mvc:interceptor>
</mvc:interceptors>
3、创建控制器
@RequestMapping("/clientLogin")
public String clientLogin(HttpSession httpSession,String username,String password){
if(username.equals("yuan")&&password.equals("123456")){
//登陆成功
httpSession.setAttribute("username",username);
return "forward:clientsList.action";
}else{
//登陆失败
return "forward:login.jsp";
}
}
4、创建登录页面
<form action="clientLogin" method="post">
姓名:<input type="text" name="username"> <br><br>
密码:<input type="text" name="password"> <br><br>
<input type="submit" value="登陆">
</form>
5、创建页面show.jsp
<a href="${pageContext.request.contextPath}/editClientIfo">查看</a>
拦截器是Aop思想的一种体现。 开发中拦截器可以单独使用,也可以同时使用多个拦截器形成一条拦截器链。