Spring拦截器配置详解(如何定义一个拦截器)

SpringMVC拦截器的使用详解:https://blog.csdn.net/xiaokang123456kao/article/details/72831049

一、前言

  springboot的拦截器也是对请求进行的系列验证或处理,关于拦截器和过滤器的区别此文不做介绍,详细可阅读:拦截器与过滤器的区别,下面说一下SSM项目中自定义拦截器的实现。

 

二、自定义拦截器类,写一个类实现 HandlerInterceptor 接口,然后重写 里面的 preHandle()、postHandle()、afterCompletion()方法

// return  true表示放行,  return false表示拦截,不向下执行
public class Interceptor1 implements HandlerInterceptor{

	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
	
		log.info("preHandle:请求前调用");
           //返回 false 则请求中断
		//判断用户是否登陆  如果没有登陆  重定向到登陆页面   不放行   如果登陆了  就放行了
		String requestURI = request.getRequestURI();
		if(!requestURI.contains("/login")){
			String username = (String) request.getSession().getAttribute("USER_SESSION");
			if(null == username){
				response.sendRedirect(request.getContextPath() + "/login.action");
				return false;
			}
		}
		return true;
	}

          /** 
          * 在业务处理器处理请求执行完成后,生成视图之前执行的动作    
          * 可在modelAndView中加入数据,比如当前时间 
          */  
	public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView modelAndView)
			throws Exception {
		  if(modelAndView != null){  //加入当前时间    
            modelAndView.addObject("var", "测试postHandle");    
          }  
		log.info("postHandle:请求后调用");	
	}
      
       /**  
       * 在DispatcherServlet完全处理完请求后被调用,可用于清理资源等   
       *   
       * 当有拦截器抛出异常时,会从当前拦截器往回执行所有的拦截器的afterCompletion()  
       */    
	public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
			throws Exception {
		 log.info("afterCompletion:请求调用完成后回调方法,即在视图渲染完成后回调");
	}

}

 preHandle
预处理回调方法,实现处理器的预处理(如登录检查),第三个参数为响应的处理器(如具体的Controller实现); 
返回值:true表示继续流程(如调用下一个拦截器或处理器);false表示流程中断(如登录检查失败),不会继续调用其他的拦截器或处理器,此时我们需要通过response来产生响应;

postHandle
后处理回调方法,实现处理器的后处理(但在渲染视图之前),此时我们可以通过modelAndView(模型和视图对象)对模型数据进行处理或对视图进行处理,modelAndView也可能为null。

afterCompletion
整个请求处理完毕回调方法,即在视图渲染完毕时回调,如性能监控中我们可以在此记录结束时间并输出消耗时间,还可以进行一些资源清理,类似于try-catch-finally中的finally,但仅调用处理器执行链中preHandle返回true的拦截器的afterCompletion。

 

preHandle

  • 调用时间:Controller方法处理之前
  • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
  • 若返回false,则中断执行,注意:不会进入afterCompletion

 

postHandle

  • 调用前提:preHandle返回true
  • 调用时间:Controller方法处理完之后,DispatcherServlet进行视图的渲染之前,也就是说在这个方法中你可以对ModelAndView进行操作
  • 执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序倒着执行
  • 备注:postHandle虽然post打头,但post、get方法都能处理

afterCompletion

  • 调用前提:preHandle返回true
  • 调用时间:DispatcherServlet进行视图的渲染之后
  • 多用于清理资源

 

 

三、在springmvc的xml配置文件中, 来构建拦截器, 拦截上面的controller

     <!-- Springmvc的拦截器 -->
	<mvc:interceptors>
		<!-- 多个拦截器 -->
		<mvc:interceptor>  
                 <!-- 具体匹配原则可以百度 -->
                 <!-- 对controller的请求url路径进行拦截,匹配的是url路径, 如果不配置或/**,将拦截所有的Controller -->   
				   /**的意思是所有文件夹及里面的子文件夹 
				   /*是所有文件夹,不含子文件夹
				   /是web项目的根目录 -->
		      <mvc:mapping path="/**"/>
		      <!-- 自定义的拦截器类 -->
		      <bean class="com.iss.springmvc.interceptor.Interceptor1"/>
		</mvc:interceptor>
	</mvc:interceptors>



 

发布了306 篇原创文章 · 获赞 193 · 访问量 71万+
展开阅读全文

如何配置filter过滤器,如何放行而不是全部拦截

03-05

配置过滤器次次失败,比如我通过servlet验证登录,然后我允许验证登录的servlet请求通过以及注册页面,我该如何配置 web.xml ``` <filter> <filter-name>loginFilter</filter-name> <filter-class>com.lero.filter.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>loginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 为什么我写的拦截器跳不到login.jsp同事resister.jsp也通过不了 ``` public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); Object object = session.getAttribute("name"); String path = request.getServletPath(); if ( path.indexOf("register") >-1) { filterChain.doFilter(servletRequest, servletResponse); return; } else { response.sendRedirect("login.jsp"); } } ``` 然后我这样写虽然都通过了,但页面确实空白 ``` public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); Object object = session.getAttribute("name"); String path = request.getServletPath(); if ( path.indexOf("login") >=0) { filterChain.doFilter(request, response); return; } else if(path.indexOf("redister.jsp")>-1){ filterChain.doFilter(request, response); } } ``` 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览