【SpringBoot1.5.2】拦截器的使用Interceptor,实现对404和500拦截

Springboot中拦截器的使用

参考:http://blog.csdn.net/linzhiqiang0316/article/details/52600839

     今天在做毕业设计时,要在springboot中实现拦截器,实现对404,500响应状态的拦截。

    <!--springboot版本 父级 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath />
	</parent>

① 创建ErrorInterceptor类,implements HandlerInterceptor

package com.tenement.utils.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

/**
 * 自定义拦截器
 * 
 * @author wk
 * @create 2018/02/27
 */
@Controller
public class ErrorInterceptor implements HandlerInterceptor {

	private static final Log logger = LogFactory.getLog(ErrorInterceptor.class);

	/*
	 * preHandle方法
	 * 
	 *
	 */
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		logger.info("【-MyInterceptor1,在请求处理之前进行调用(controller方法调用之前)-】");
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		logger.info("【-MyInterceptor1,请求处理之后进行调用,但是在视图被渲染之前(controller方法调用之后)-】");
		if(response.getStatus()==500){
			modelAndView.setViewName("/view/base/errorpage/500.html");
			/*
			 * setViewName(String viewName);
			 * 为此ModelAndView设置视图名称,由DispatcherServlet通过ViewResolver解析。 将覆盖任何预先存在的视图名称或视图。
			 */
		}else if(response.getStatus()==404){
			modelAndView.setViewName("/view/base/errorpage/404.html");
		}
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		logger.info("【-MyInterceptor1,在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要用于资源清理工作)-】");
	}

}

② 创建MyWebAppConfigurer extends WebMvcConfigurerAdapter

package com.tenement.utils.interceptor;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		registry.addInterceptor(new ErrorInterceptor()).addPathPatterns("/**");
		super.addInterceptors(registry);
	}
	/*
	 * 对页面的静态资源也会进行拦截,导致异常
	 * 
	 */
}

③ 这里可以看到通过浏览器发出请求,控制台会打印自定义拦截器中输出的信息

④ ErrorInterceptor中postHandle方法,通过ModelAndView类返回到指定的视图404.html

    500.html.

注意:

  写了这两个类就实现了拦截器的功能,因为是用的springboot,所以大家在写完这两个类之后别忘了,在main 

方法上加上这几个类的包路径 

⑤ 参考前面大佬提到的,这种写法可以出现问题,就是关于页面中的资源路径,找不到的话可能会出现异常,这里我也贴一下代码。但是,不是很懂是如何拦截的。

package com.tenement.utils.interceptor;

import org.springframework.boot.autoconfigure.web.ErrorController;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MainsiteErrorController implements ErrorController {

	private static final String ERROR_PATH = "/error";

	@RequestMapping(value = ERROR_PATH)
	public String handleError() {
		return "errorpage/error";
	}

	@Override
	public String getErrorPath() {
		return ERROR_PATH;
	}

}

springframe中接口ErrorController

package org.springframework.boot.autoconfigure.web;

import org.springframework.stereotype.Controller;

/**
 * Marker interface used to indicate that a {@link Controller @Controller} is used to
 * render errors. Primarily used to know the error paths that will not need to be secured.
 * 标记界面用于指示已使用{@link Controller @Controller}呈现错误,主要用于了解不需要保护的错误路径。
 * @author Phillip Webb
 */
public interface ErrorController {

	/**
	 * Returns the path of the error page.
	 * @return the error path
	 */
	String getErrorPath();

}

这里也贴个演示的图片:

1.正常的

2.将页面中引入的外部文件src改错一个

F12,页面信息

可以看到同样的请求,自定义拦截器的方法被执行了两次。

问题:对于ajax中的请求拦截还没有试过,

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值