Loading... # **拦截器** ## **目标** 1. **了解SpringMVC拦截器** 2. **熟练使用拦截器** 3. **举一反三,能够使用拦截器实现登录验证** ## **一、介绍** **SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。开发者可以自己定义一些拦截器来实现特定的功能。** ****过滤器与拦截器的区别:******拦截器是AOP思想的具体应用。** ****过滤器**** * **servlet规范中的一部分,任何java web工程都可以使用** * **在url-pattern中配置了/*之后,可以对所有要访问的资源进行拦截** ****拦截器****** ** * **拦截器是SpringMVC框架自己的,只有使用了SpringMVC框架的工程才能使用** * **拦截器只会拦截访问的控制器方法, 如果访问的是jsp/html/css/image/js是不会进行拦截的** ## **二、拦截器实现** **那如何实现拦截器呢?** **想要自定义拦截器,必须实现 HandlerInterceptor 接口。** **1、新建一个Moudule, 添加web支持** **2、配置web.xml 和 springmvc-servlet.xml 文件** **3、编写一个拦截器** ``` public class MyInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("在请求处理的方法之前执行,true执行下一个拦截器,false反之"); return true; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("在请求处理的方法之后执行"); } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("在dispatcherServlet处理后执行,做清理工作"); } } ``` **4、在springmvc的配置文件中配置拦截器** ``` <!--关于拦截器的配置--> <mvc:interceptors> <mvc:interceptor> <!--/** 包括路径及其子路径--> <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截--> <!--/admin/** 拦截的是/admin/下的所有--> <mvc:mapping path="/**"/> <!--bean配置的就是拦截器--> <bean class="com.shida.interceptor.MyInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> ``` **5、编写一个Controller,接收请求** ``` @RestController public class HelloController { @RequestMapping("/test") public String test() { System.out.println("test执行了"); return "ok"; } } ``` **6、启动tomcat 测试一下!** ## **三、案例实现** **验证用户是否登录 (认证用户)** **1、有一个登陆页面,需要写一个controller访问页面。** **2、登陆页面有一提交表单的动作。需要在controller中处理。判断用户名密码是否正确。如果正确,向session中写入用户信息。*****返回登陆成功。*** **3、拦截用户请求,判断用户是否登陆。如果用户已经登陆。放行, 如果用户未登陆,跳转到登陆页面** ****测试**** **1、编写一个登陆页面 login.jsp** ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>登录页面</title> </head> <body> <form action="${pageContext.request.contextPath}/user/login"> <span>用户名:</span> <input type="text" name="username"/><br> <span>密码:</span> <input type="text" name="psd"/><br> <input type="submit" value="登录"> </form> </body> </html> ``` **2、编写一个Controller处理请求** ``` @Controller @RequestMapping("/user") public class LoginController { /** * 功能描述: 跳转到登录页 * * @return java.lang.String * @author jiaoqianjin * @date 2021/3/21 */ @RequestMapping("/goLogin") public String goLogin() { return "login"; } /** * 功能描述: 登录页 * * @return java.lang.String * @author jiaoqianjin * @date 2021/3/21 */ @RequestMapping("/login") public String login(HttpSession session, String username, String psd) { // session记录用户信息 session.setAttribute("user", username); return "success"; } /** * 功能描述: 登录成功页 * * @return java.lang.String * @author jiaoqianjin * @date 2021/3/21 */ @RequestMapping("/success") public String goSuccess() { return "success"; } } ``` **3、编写一个登陆成功的页面 success.jsp** ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>首页</title> </head> <body> <h1>登录成功页面</h1> ${user} </body> </html> ``` **4、在 index 页面上测试跳转!启动Tomcat 测试,未登录也可以进入主页!** ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>$Title$</title> </head> <body> <a href="${pageContext.request.contextPath}/user/goLogin">登录</a> <a href="${pageContext.request.contextPath}/user/success">成功页面</a> </body> </html> ``` **5、编写用户登录拦截器** ``` public class LoginInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(request.getRequestURI()); // 如果已经在登录页,放行 if (request.getRequestURI().contains("login")) { return true; } // 如果session存在用户信息,放行 if (request.getSession().getAttribute("user")!=null) { return true; } // 否则,用户未登录,跳转到登录页面 request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request,response); return false; } } ``` **6、在Springmvc的配置文件中注册拦截器** ``` <!-- 配置拦截器 --> <mvc:interceptors> <mvc:interceptor> <!--/** 包括路径及其子路径--> <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截--> <!--/admin/** 拦截的是/admin/下的所有--> <mvc:mapping path="/**"/> <!--bean配置的就是拦截器--> <bean class="com.shida.interceptor.MyInterceptor"></bean> </mvc:interceptor> <mvc:interceptor> <mvc:mapping path="/user/**"/> <bean class="com.shida.interceptor.LoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors> ``` **7、再次重启Tomcat测试!** **8、添加注销功能** **success.jsp修改** ``` <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>首页</title> </head> <body> <h1>登录成功页面</h1> ${user} <a href="${pageContext.request.contextPath}/user/goOut">注销</a> </body> </html> ``` **controller添加** ``` /** * 功能描述: 注销登录 * * @return java.lang.String * @author jiaoqianjin * @date 2021/3/21 */ @RequestMapping("/goOut") public String goOut(HttpSession session) { session.removeAttribute("user"); return "login"; } ``` Last modification:June 4th, 2021 at 10:29 am © 允许规范转载