Spring Web MVC 的处理器拦截器类似于Servlet 开发中的过滤器Filter,用于对网络请求进行预处理和后处理。拦截网络请求,进行逻辑判断时使用。
使用方法:1、自定义拦截器,2、在spring-mvc中配置拦截器。
自定义拦截器:继承自HandlerInterceptorAdapter。
package com.awb.interceptor;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定义拦截器处理器
* 继承自:HandlerInterceptorAdapter
*/
public class LoginInterceptor extends HandlerInterceptorAdapter {
//需求:判断用户是否登录,如果未登录,跳转到登录页面
/**
* Controller执行前调用此方法
* 返回true表示继续执行,返回false中断执行
* 主要用于权限拦截,登录校验等
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
if (!requestURI.contains("/login")){
//判断当前用户是否登录
String userName = (String) request.getSession().getAttribute("userName");
//如果未登录,跳转到登录页面
if (null==userName){
//重定向,进行网络请求
response.sendRedirect(request.getContextPath()+"/login/goLogin");
//拦截当前请求
return false;
}
}
//如果是调用登录接口,就直接跳转到对LoginController
return true;
}
}
2、在spring-mvc中配置拦截器
<!--配置拦截器,拦截网络请求-->
<mvc:interceptors>
<!--定义一个拦截器-->
<mvc:interceptor>
<!--定义拦截规则,拦截所有的网络请求-->
<mvc:mapping path="/**"/>
<!--当前请求不进行拦截-->
<mvc:exclude-mapping path="/deposits/*"/>
<!--自定义的拦截器类,用于进行逻辑判断-->
<!--拦截到url后交给LoginInterceptor拦截器进行处理判断-->
<bean class="com.awb.interceptor.LoginInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
LoginController:
package com.awb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping(value = "/login")
public class LoginController {
/**
* 跳转到登录页面
* @return
*/
@RequestMapping(value = "/goLogin")
public String goLogin(){
//跳转到登录页面
return "login";
}
/**
* 登录操作
* @return
*/
@RequestMapping(value = "/doLogin",method = RequestMethod.GET)
public String doLogin(String name, HttpSession httpSession){
//httpSession域中存储用户登录信息
httpSession.setAttribute("userName",name);
return "redirect:/home/index.do";
}
}
需要自定义拦截器类,拦截器类中有三个方法:方法前,方法后,页面渲染后。比如用户没有登录不放行,不让请求进入controller层。
最好值配置一个拦截器,两个拦截器的话,逻辑关系不好处理。