java拦截404_SpringBoot实现对404和500等错误的拦
截
今天给⼤家介绍⼀下SpringBoot中的⽤法,相⽐Struts2中的,SpringBoot的就显得更加⽅便简单了。
只需要写⼏个实现类就可以轻轻松松实现的功能了,⽽且不需要配置任何多余的信息,对程序员来说简直是⼀种福利啊。
废话不多说,下⾯开始介绍的实现过程:
第⼀步:创建我们⾃⼰的类并实现 HandlerInterceptor 接⼝。
package example.Interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
/**
* ⾃定义1
*
* @author 林志强(208017534)
* @create 2016年9⽉20⽇
*/
@Controller
public class ErrorInterceptor implements HandlerInterceptor {
/
**
* preHandle⽅法是进⾏处理器拦截⽤的,顾名思义,该⽅法将在Controller处理之前进⾏调⽤,SpringMVC中的Interceptor是链式的,可以同时存在
* 多个Interceptor,然后SpringMVC会根据声明的前后顺序⼀个接⼀个的执⾏,⽽且所有的Interceptor中的preHandle⽅法都会在
* Controller⽅法调⽤之前调⽤。SpringMVC的这种Interceptor链式结构也是可以进⾏中断的,这种中断⽅式是令preHandle的返
* 回值为false,当preHandle的返回值为false的时候整个请求就结束了。
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println(">>>MyInterceptor1>>>>>>>在请求处理之前进⾏调⽤(Controller⽅法调⽤之前)");
return true;// 只有返回true才会继续向下执⾏,返回false取消当前请求
}
/**
* 这个⽅法只会在当前这个Interceptor的preHandle⽅法返回值为true的时候才会执⾏。postHandle是进⾏处理器拦截⽤的,它的执⾏时间是在处理器进⾏处理之
* 后,也就是在Controller的⽅法调⽤之后执⾏,但是它会在DispatcherServlet进⾏视图的渲染之前执⾏,也就是说在这个⽅法中你可以对ModelAndView进⾏操
* 作。这个⽅法的链式结构跟正常访问的⽅向是相反的,也就是说先声明的Interceptor该⽅法反⽽会后调⽤,这跟Struts2⾥⾯的的执⾏过程有点像,
* 只是Struts2⾥⾯的intercept⽅法中要⼿动的调⽤ActionInvocation的invoke⽅法,Struts2中调⽤ActionInvocation的invoke⽅法就是调⽤下⼀个Interceptor
springboot结构* 或者是调⽤action,然后要在Interceptor之前调⽤的内容都写在调⽤invoke之前,要在Interceptor之后调⽤的内容都写在调⽤invoke⽅法之后。
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
System.out.println(">>>MyInterceptor1>>>>>>>请求处理之后进⾏调⽤,但是在视图被渲染之前(Controller⽅法调⽤之后)");
Status()==500){
modelAndView.setViewName("/errorpage/500");
}else Status()==404){
modelAndView.setViewName("/errorpage/404");
}
}
/**
* 该⽅法也是需要当前对应的Interceptor的preHandle⽅法的返回值为true时才会执⾏。该⽅法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执⾏,
* 这个⽅法的主要作⽤是⽤于清理资源的,当然这个⽅法也只能在当前这个Interceptor的preHandle⽅法的返回值为true时才会执⾏。
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
System.out.println(">>>MyInterceptor1>>>>>>>在整个请求结束之后被调⽤,也就是在DispatcherServlet 渲染了对应的视图之后执⾏(主要是⽤于进⾏资源清理⼯作)");
}
}
实现类中⼏个函数的作⽤,以及调⽤的先后顺序都很明确,我这⾥就不多介绍了。
第⼆部:创建⼀个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors ⽅法。实例化我们⾃定义的,然后将对像⼿动添加到链中(在addInterceptors⽅法中添加)。
figuration;
import example.Interceptor.ErrorInterceptor;
import example.Interceptor.MyInterceptor2;
import t.annotation.Configuration;
import org.springframework.fig.annotation.InterceptorRegistry;
import org.springframework.fig.annotation.WebMvcConfigurerAdapter;
@Configuration
public class MyWebAppConfigurer extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 多个组成⼀个链
// addPathPatterns ⽤于添加拦截规则
// excludePathPatterns ⽤户排除拦截
registry.addInterceptor(new ErrorInterceptor()).addPathPatterns("/**");
super.addInterceptors(registry);
}
}
到这⾥就基本实现了,我上⾯给出的例⼦中是可以实现对404或者500的拦截。
不过需要注意的是,这种拦截有时候也会出现特别⼤问题。例如⼀个⽹页中如果需要加载很多的图⽚或者js⽂件资源,可是正好没有这个资源,也就是不到这么多个资源报⼀堆的404错误。这个时候如果还是单纯的使⽤这种拦截就会出现null指针异常的情况。
针对这种情况,我研究了⼀种⽅法可以解决这样类似的问题。
解决⽅案就是:创建⼀个类并实现ErrorController接⼝,这样就可以利⽤这个类来处理上⾯发⽣的问题了。
下⾯给出代码:
ller;
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;
}
}
这样就可以实现对404,500等错误信息的拦截了,⽽且也不会发⽣那种空指针异常的情况了,是不是特别⽅便啊!以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持脚本之家。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论