springmvc - 拦截器
springmvc - 拦截器
中柠檬 发表于1年前
springmvc - 拦截器
  • 发表于 1年前
  • 阅读 12
  • 收藏 1
  • 点赞 0
  • 评论 0

腾讯云 技术升级10大核心产品年终让利>>>   

###定义拦截器

实现HandlerInterceptor方法。

###拦截器配置

springmvc 拦截器针对HandlerMapping进行拦截设置。如果HandlerMapping映射成功才进行拦截。

<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中。

自定义拦截器

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");
    }
}

###拦截器规律

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

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

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

一、需求:

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

二、登录controller

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";
   }

}

三、登录拦截实现

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,表示拦截。
}

四、注意要配置拦截器映射

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。

  • 点赞
  • 收藏
  • 分享
粉丝 7
博文 177
码字总数 83817