文档章节

springmvc - 拦截器

lemos
 lemos
发布于 2016/11/21 15:00
字数 672
阅读 16
收藏 1

###定义拦截器

实现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。

© 著作权归作者所有

共有 人打赏支持
上一篇: git 使用说明
下一篇: springmvc - RESTful
lemos
粉丝 7
博文 180
码字总数 91399
作品 0
芜湖
后端工程师
私信 提问
Spring AOP 日志拦截器的事务管理

如果要在方法执行前或后或抛出异常后加上一个自己的拦截器,或者一个环绕拦截器,在拦截器中执行一些操作,比如执行一些数据库操作,记录一些信 息,这些操作通过调用一个服务类的方法来执行...

哲别0
05/18
0
0
Spring 拦截器机制研究与扩展

Spring 拦截器配置有以下三种 第一种 mvc:interceptors </mvc:interceptors> 第二种 mvc:interceptors </mvc:interceptors> 第三种 对指定HandlerMapping加拦截器 <bean class="org.springf......

alex.tong
2012/12/20
0
0
疯狂Spring Cloud连载(9)——RestTemplate的负载均衡原理

本文节选自《疯狂Spring Cloud微服务架构实战》 京东购买地址:https://item.jd.com/12256011.html 当当网购买地址:http://product.dangdang.com/25201393.html Spring Cloud教学视频:htt...

杨大仙的程序空间
2017/10/18
0
2
面试必问的Spring AOP原理、SpringMVC过程

Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以。但今天笔者带大家一起深入浅出源码,看看他的原理。以期让印象更加深刻,面试的时候游刃有余。 Sp...

Java干货分享
10/25
0
0
SpringMVC 拦截器不拦截静态资源的三种处理方式

SpringMVC 拦截器不拦截静态资源的三种处理方式 SpringMVC提供mvc:resources来设置静态资源,但是增加该设置如果采用通配符的方式增加拦截器的话仍然会被拦截器拦截,可采用如下方案进行解决...

独钓渔
2017/11/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

存储过程知识点收集

记录下,以后要常用的问题 1、获取刚刚插入数据产生的ID SCOPE_IDENTITY 返回当前作用域的插入后产生的一条ID @@IDENTITY 返回当前表的最后一条ID

轻轻的往前走
4分钟前
0
0
elixir keyword和map的区别

┌──────────────┬────────────┬───────────────────────┐ │ Keyword List │ Map/Struct │ HashDict (deprec...

wmzsonic
7分钟前
0
0
解决bootstrap-table-fixed-columns.js显示列与隐藏列按钮切换表格不对齐

<table class="table-striped table-hasthead nowrap" id="tableTest1" data-search="true" data-show-columns="true" data-fixed-columns="true" data-fixed-number="3"></table> 含有dat......

tianyawhl
10分钟前
0
0
ES6 系列之 defineProperty 与 proxy

摘要: ## 前言 我们或多或少都听过“数据绑定”这个词,“数据绑定”的关键在于监听数据的变化,可是对于这样一个对象:`var obj = {value: 1}`,我们该怎么知道 obj 发生了改变呢? ## def...

阿里云官方博客
15分钟前
0
0
美团点评携手 PingCAP 开启新一代数据库深度实践之旅

一、背景和现状 在美团,基于 MySQL 构建的传统关系型数据库服务已经难于支撑公司业务的爆发式增长,促使我们去探索更合理的数据存储方案和实践新的运维方式。随着近一两年来分布式数据库大放...

TiDB
15分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部