文档章节

springmvc - 拦截器

柠檬的橘子
 柠檬的橘子
发布于 2016/11/21 15:00
字数 672
阅读 13
收藏 1
点赞 0
评论 0

###定义拦截器

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

© 著作权归作者所有

柠檬的橘子
粉丝 6
博文 177
码字总数 86270
作品 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
SpringMVC 拦截器不拦截静态资源的三种处理方式

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

独钓渔
2017/11/07
0
0
SpringMVC开发 知识点速查

SpringMVC入门 什么是SpringMVC 实现MVC设计模式的框架 SpringMVC核心组件 DispatcherServlet 前置控制器,调度 Handler 处理器,完成具体业务逻辑 HandlerMapping 将请求映射到Handler,映射...

linxinzhe
05/19
0
0
springboot学习(二)——springmvc配置使用

以下内容,如有问题,烦请指出,谢谢 上一篇讲解了springboot的helloworld部分,这一篇开始讲解如何使用springboot进行实际的应用开发,基本上寻着spring应用的路子来讲,从springmvc以及web...

嘻哈开发者
04/26
0
0
Spring AOP与拦截器的区别

作用层面 拦截器只对action负责,作用层面一般位于Controller层 Spring AOP主要是拦截对Spring管理的Bean的访问,一般作用与Service层 2、联系与区别 联系: Spring AOP和拦截器一样,都是A...

niithub
05/06
0
0
使用 Spring 更好地处理 Struts 动作

Struts Recipes 的合著者 George Franciscus 将介绍另一个重大的 Struts 整合窍门 —— 这次是将 Struts 应用程序导入 Spring 框架。请跟随 George,他将向您展示如何改变 Struts 动作,使得...

SeanCai
2010/08/29
0
0
spring boot 2.x静态资源会被HandlerInterceptor拦截的原因和解决方法

在spring boot 1.5.x中,resources/static目录下的静态资源可以直接访问,并且访问路径上不用带static,比如静态资源放置位置如下图所示: 那么访问静态资源的路径可以是: http://localhost...

Mr---D
04/13
0
0
在Spring-Boot中实现通用Auth认证的几种方式

前言 最近一直被无尽的业务需求淹没,没时间喘息,终于接到一个能让我突破代码舒适区的活儿,解决它的过程非常曲折,一度让我怀疑人生,不过收获也很大,代码方面不明显,但感觉自己抹掉了 ...

枕边书
07/17
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

idea tomcat 远程调试

tomcat 配置 编辑文件${tomcat_home}/bin/catalina.sh,在文件开头添加如下代码。    CATALINA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=7829" Idea端配......

qwfys
今天
1
0
遍历目录下的文件每250M打包一个文件

#!/usr/bin/env python # -*- utf-8 -*- # @Time : 2018/7/20 0020 下午 10:16 # @Author : 陈元 # @Email : abcmeabc@163.com # @file : tarFile.py import os import tarfile import thr......

寻爱的小草
今天
1
0
expect同步文件&expect指定host和要同步的文件&构建文件分发系统&批量远程执行命令

20.31 expect脚本同步文件 expect通过与rsync结合,可以在一台机器上把文件自动同步到多台机器上 编写脚本 [root@linux-5 ~]# cd /usr/local/sbin[root@linux-5 sbin]# vim 4.expect#!/...

影夜Linux
今天
1
0
SpringBoot | 第九章:Mybatis-plus的集成和使用

前言 本章节开始介绍数据访问方面的相关知识点。对于后端开发者而言,和数据库打交道是每天都在进行的,所以一个好用的ORM框架是很有必要的。目前,绝大部分公司都选择MyBatis框架作为底层数...

oKong
今天
12
0
win10 上安装解压版mysql

1.效果 2. 下载MySQL 压缩版 下载地址: https://downloads.mysql.com/archives/community/ 3. 配置 3.1 将下载的文件解压到合适的位置 我最终将myql文件 放在:D:\develop\mysql 最终放的位...

Lucky_Me
今天
2
0
linux服务器修改mtu值优化cpu

一、jumbo frames 相关 1、什么是jumbo frames Jumbo frames 是指比标准Ethernet Frames长的frame,即比1518/1522 bit大的frames,Jumbo frame的大小是每个设备厂商规定的,不属于IEEE标准;...

问题终结者
今天
1
0
expect脚本同步文件expect脚本指定host和要同步的文件 构建文件分发系统批量远程执行命令

expect脚本同步文件 在一台机器上把文件同步到多台机器上 自动同步文件 vim 4.expect [root@yong-01 sbin]# vim 4.expect#!/usr/bin/expectset passwd "20655739"spawn rsync -av ro...

lyy549745
今天
1
0
36.rsync下 日志 screen

10.32/10.33 rsync通过服务同步 10.34 linux系统日志 10.35 screen工具 10.32/10.33 rsync通过服务同步: rsync还可以通过服务的方式同步。那需要开启一个服务,他的架构是cs架构,客户端服务...

王鑫linux
今天
1
0
matplotlib 保存图片时的参数

简单绘图 import matplotlib.pyplot as pltplt.plot(range(10)) 保存为csv格式,放大后依然很清晰 plt.savefig('t1.svg') 普通保存放大后会有点模糊文件大小20多k plt.savefig('t5.p...

阿豪boy
今天
3
0
java 8 复合Lambda 表达式

comparator 比较器复合 //排序Comparator.comparing(Apple::getWeight);List<Apple> list = Stream.of(new Apple(1, "a"), new Apple(2, "b"), new Apple(3, "c")) .collect(......

Canaan_
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部