###定义拦截器java
实现HandlerInterceptor方法。web
###拦截器配置spring
springmvc 拦截器针对HandlerMapping进行拦截设置。若是HandlerMapping映射成功才进行拦截。session
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"> <property name="interceptors"> <list> <ref bean="handlerInterceptor1"/> <ref bean="handlerInterceptor2"/> </list> </property> </bean> <bean id="handlerInterceptor1" class="club.lemos.ssm.interceptor.HandlerInterceptor1"/> <bean id="handlerInterceptor2" class="club.lemos.ssm.interceptor.HandlerInterceptor1"/>
springmvc 配置类型全局的拦截器,springmvc框架将配置的相似全局的拦截器注入到每一个HandlerMapping中。mvc
public class HandlerInterceptor1 implements HandlerInterceptor { //进入Handler以前 //用于身份验证、身份受权 @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { System.out.println("preHandle...interceptor1"); return true; } //在Handler以后,在DispatcherServlet进行渲染以前 //应用场景从ModelAndView出发,能够将公用模型数据传导视图(好比菜单导航)。也能够在这里统一指定视图。 @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { System.out.println("postHandle...interceptor1"); } //在渲染视图以后 //统一的异常处理。统一的日志处理。 @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { System.out.println("afterCompletion...interceptor1"); } }
###拦截器规律app
例如:若要进行统一日志处理,须要将第一个Prehandler放行。框架
###拦截器的应用(实现登陆认证)ide
1、需求:post
2、登陆controllerurl
LoginController .java
@Controller public class LoginController { //用户登陆 @RequestMapping("/login") public String login(Model model, HttpSession session, String username, String password, HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //调用service 进行验证 //这里没有验证,所以点击登陆会直接进入商品界面。 //... session.setAttribute("username", username); if (username == null || username.isEmpty()) { //当用户名为null或者为空时,让他登陆。 return "login"; } else if (!username.equals("张三")) { model.addAttribute("msg", "用户名或者密码错误!"); return "login"; } return "redirect:/items/queryItems"; } //用户注销 @RequestMapping("/logout") public String logout(HttpSession session) { session.invalidate(); return "redirect:/items/queryItems"; } }
3、登陆拦截实现
loginInterceptor.java
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { //判断url是不是公开地址 String url = httpServletRequest.getRequestURI(); if (url.contains("login")) { return true; } //判断session是否存在 HttpSession session = httpServletRequest.getSession(); String username = (String) session.getAttribute("username"); if (username != null && !username.isEmpty()) { System.out.println("名字"+username+"。"); return true; } //拦截的处理:打到url为login的Handler,让它去处理 httpServletResponse.sendRedirect(httpServletRequest.getContextPath()+"/login"); return false; //反回false,表示拦截。 }
4、注意要配置拦截器映射
springmvc-servlet.xml
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**"/> <bean class="club.lemos.ssm.interceptor.LoginInterceptor"/> </mvc:interceptor> </mvc:interceptors>
注意:不能重定向到WEB-INF下的网页。若要重定向到此网页,必须在controller中,且该controller有requestMapping 的url。