1、java里的拦截器是动态拦截Action调用的对象。它提供了一种机制可以使开发者可以定义在一个action执行的前后执行的代码,也可以在一个action执行前阻止其执行,同时也提供了一种可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中拦截器用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。
2、实现拦截器
a)实现HandlerInterceptor接口
package com.wc.interceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class MyInterceptor implements HandlerInterceptor{ //在请求处理的方法之前执行 //如果返回true,执行下一个拦截器,如果返回false,则不执行 @Override public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("-------处理前-------"); return true; } //在请求处理的方法执行之后执行 @Override public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("-------处理后-------"); } //在DispatcherServlet处理后执行-----清理工作 @Override public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { // TODO Auto-generated method stub } }
b)配置拦截器
<!-- 拦截器的配置 --> <mvc:interceptors> <mvc:interceptor> <!-- /** 包括路径及其子路径 如果是/admin/* 拦截是的/admin/add,/admin/list etc. 而/admin/user/add不被拦截 如果是/admin/** 拦截 /admin/add,/admin/list, /admin/user/add etc. --> <mvc:mapping path="/**"/> <bean class="com.wc.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
3、如果被拦截能否到指定页面?
使用HttpServletRequest和HttpServletResponse实现转发
@Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object arg2) throws Exception { // TODO Auto-generated method stub System.out.println("-------处理前-------"); resp.sendRedirect(req.getContextPath()+"/index.jsp"); return false; }
4、拦截器的应用----登陆拦截器
package com.wc.interceptor; import java.util.List; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; public class LoginInterceptor implements HandlerInterceptor{ private List<String> allowedPass; //如果返回true表示不被拦截,执行下一个拦截器,如果返回false表示被拦截,则不执行 //允许哪些url不被拦截,哪些需要被拦截 @Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object obj) throws Exception { // TODO Auto-generated method stub System.out.println("-------处理前-------"); String url = req.getRequestURL().toString(); //先判断session中是否有 Object user = req.getSession().getAttribute("user"); if(user!=null) return true; for(String temp:allowedPass){ if(url.endsWith(temp)){ return true; } } resp.sendRedirect(req.getContextPath()+"/login.jsp"); return false; } //在请求处理的方法执行之后执行 @Override public void postHandle(HttpServletRequest req, HttpServletResponse resp, Object obj, ModelAndView maw) throws Exception { System.out.println("-------处理后-------"); } //在DispatcherServlet处理后执行-----清理工作 @Override public void afterCompletion(HttpServletRequest req, HttpServletResponse resp, Object obj, Exception exp) throws Exception { // TODO Auto-generated method stub } public void setAllowedPass(List<String> allowedPass) { this.allowedPass = allowedPass; } }
配置,在XML文件中配置拦截更加灵活
<!-- 拦截器的配置 --> <mvc:interceptors> <mvc:interceptor> <!-- /** 包括路径及其子路径 -拦截所有controller 如果是/admin/* 拦截是的/admin/add,/admin/list etc. 而/admin/user/add不被拦截 如果是/admin/** 拦截 /admin/add,/admin/list, /admin/user/add etc. --> <mvc:mapping path="/**"/> <mvc:exclude-mapping path=""/> <!-- 对应的拦截器 --> <bean class="com.wc.interceptor.LoginInterceptor"> <property name="allowedPass"> <list> <!-- 表示可通过拦截器的 --> <value>login.do</value> <value>add.do</value> </list> </property> </bean> </mvc:interceptor> </mvc:interceptors>