springmvc - 拦截器

###定义拦截器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

  1. 只有第一个拦截器放行了,才有可能执行后面的拦截器。
  2. 第一个拦截器的 postHandler不必定执行,只有当全部拦截器都经过时,才会执行postHandler。
  3. 第一个拦截器的 afterCompletion必定执行。

例如:若要进行统一日志处理,须要将第一个Prehandler放行。框架

###拦截器的应用(实现登陆认证)ide

1、需求:post

  1. 用户请求url
  2. 若是url 是公开地址,放行。
  3. 若是用户session 不存在,跳转到登陆界面。
  4. 若是用户session 存在,放行。

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。

相关文章
相关标签/搜索