
在配置文件中如果只定义了一个拦截器,程序首先执行拦截器类中的preHandle()方法。如果preHandle()方法返回false,则中断后续所有代码的执行。如果该方法返回true,程序将继续执行处理器以处理请求。当处理器执行过程中没有出现异常时,会执行拦截器中的postHandle()方法。postHandle()方法执行后会通过相关资源向客户端返回响应,并执行拦截器的afterCompletion()方法;如果处理器执行过程中出现异常,将跳过拦截器中的postHandle()方法,直接由前端控制器渲染异常页面返回响应,最后执行拦截器中的afterCompletion()方法。
下面通过拦截器来完成一个用户登录权限验证的Web应用,具体要求如下:只有成功登录的用户才能访问系统的主页面main.jsp。如果没有成功登录就直接访问主页面,拦截器将拦截请求,并将请求转发到登录页面login.jsp。当成功登录的用户在系统主页面中单击“退出”链接时,会回到登录页面。具体实现步骤如下。
01、创建实体类
创建一个名为User的实体类,用于封装当前用户的用户名和密码。
02、创建控制器
控制器代码如文件1所示。
【文件1】MyLoginController.java

如文件1所示,在客户端请求登录页面(login.jsp)和主页面(main.jsp)时,请求都需要由前端控制器转发,所以在第12~15行和第31~34行增加两个处理器,分别负责转发访问登录页和访问主页的请求。第16~30行定义了用户登录处理器,当验证过用户名和密码后,将用户信息写入session域,并重定向到main.jsp。第35~40行新增处理器logout(),用来处理用户的注销请求,当用户单击“退出”超链接时,注销session对象并重定向到登录页。
03、创建拦截器
创建一个名为com.example.springmvc.interceptor的包,在该包中创建一个名为LoginInterceptor的拦截器。重写preHandler()方法对请求进行拦截。如果用户未经登录而请求相关资源,则执行拦截。判断用户是否登录的标准是HttpSession对象中是否存储了用户信息。拦截器代码如文件2所示。
【文件2】LoginInterceptor.java

04、配置拦截器
修改Spring MVC的配置文件,除了配置包扫描、注解驱动、视图解析器外,还要增加拦截器配置,代码如下:
05、编写JSP文件,执行测试
在WEB-INF/jsp文件夹下,创建两个JSP文件,一个登录页login.jsp,一个主页面main.jsp,代码分别如文件3,文件4所示。
【文件3】login.jsp
如文件3所示,表单输入域的名字 name 和pwd要与实体类的属性名一致,这样当表单提交时,表单输入域的值,可作为请求参数值自动映射给实体类User的相关属性。
【文件4】main.jsp
启动Tomcat服务器,在浏览器的地址栏输入“http://localhost:8080/springmvc/tologin”,填入用户名和密码后,可登录主页,如图1所示。
单击“退出”超链接后会返回登录页。此时,将地址栏的地址修改为“http://localhost:8080/springmvc/main”,在没有登录的情况下访问主页,这个请求会被拦截器拦截并将请求转发给login.jsp页面,浏览器显示的结果如图2所示。读者还可以自行验证用户名、密码错误情况下的运行结果,此处略。