公共能力。所有的action都希望执行。
例子:登录拦截器
如果没有登录,所有的除了登录之外的Action应该都不能访问。
拦截器需要实现HandlerInterceptor接口
preHandle:Handler方法之前执行
postHandle进入Handler方法之后,返回modelAndView之前执行
afterCompletion执行Handler完成执行此方法
开发流程:
第一步:开发登录拦截器 拦截器一般 都覆写preHandle 方法 其他方法看根据具体需求
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
/**
* 当请求路径Controller 包含了 login 就直接放行
*/
if(requestURI.indexOf("login")>0){
return true;
}
/**
* 当请求包含base 的 Controller 直接放行 类似于游客可以直接访问的资源
*/
if(requestURI.indexOf("base")>0){
return true;
}
//从session 里面获取信息 看看是否之前登陆过
Object user = request.getSession().getAttribute("user");
//如果登陆过 则放行
if(user!=null){
return true;
}
//如果没有登录 不放心 重定向或者转发到 登录页
response.sendRedirect("/login.jsp");
// request.getRequestDispatcher("/login.jsp").forward(request,response);
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
第二步:开发登录Action
@Controller
public class LoginController {
@RequestMapping("/login.do")
public String doLogin(User user,HttpServletRequest request){
if(user!=null){
if("张颖豪".equals(user.getUsername())&&"123".equals(user.getPassword())){
request.getSession().setAttribute("user" , user);
}
}
return "index";
}
@RequestMapping("/base.do")
@ResponseBody
public List<String> basePage(){
ArrayList<String> arrayList = new ArrayList<>();
arrayList.add("这是一个访客可以访问的界面");
arrayList.add("这是一个访客可以访问的界面a");
arrayList.add("这是一个访客可以访问的界面b");
arrayList.add("这是一个访客可以访问的界面c");
return arrayList;
}
}
第三步:配置拦截器
/** 表示所有Controller之前都执行
拦截系统中已经存在的请求。
<!-- 配置拦截器 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/**"/><!-- 系统的所有请求 -->
<bean class="com.zyh.interceptor.LoginInterceptor"></bean><!-- 登录拦截器 -->
</mvc:interceptor>
</mvc:interceptors>
第四步: 测试
当我们直接访问游客可以访问的路径的时候: 直接放行,允许访问

我们并没有对下面的路径设置放行操作,所以当我们访问此访问路径的时候 会走拦截器
http://localhost:8080/pay/pay.do
在浏览器 输入http://localhost:8080/pay/pay.do 之后发现 重定向到了 登录页

当我们登录成功之后 再次访问 http://localhost:8080/pay/pay.do

做登录拦截器的优势:不需要在每个action中做登录判断。只需要做一个拦截器,所有的action在具体执行之前都调用拦截器。管理系统适用。
网友评论