SpirngBoot—异常处理、拦截器、跨域
前言
异常处理是网站不可避免的,为了用户的体验感,每个完整的网站都有着属于自己的报错页,从而不会展示代码错误给用户看
拦截器的实现很常见,像权限拦截、登陆拦截在很多网站是很常见的~
异常处理
--------------- 普通500异常
/**
* 系统异常处理器
*/
@ControllerAdvice
public class SysExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ModelAndView normal(HttpServletRequest req, HttpServletResponse res,Exception e){
ModelAndView mv=new ModelAndView();
mv.setViewName("error/my500");//错误跳转页
mv.addObject("errormsg",e.getMessage());//传错误信息
return mv;
}
}
--------------- ajax json异常
自定义ajax异常
/**
* 自定义ajax异常
*/
public class AjaxException extends Exception{
public AjaxException(String message) {
super(message);
}
}
再加入系统异常处理,放在500异常同一个类里
@ExceptionHandler(value = AjaxException.class)
@ResponseBody
public JsonResult ajax(HttpServletRequest req, HttpServletResponse res, Exception e){
JsonResult json=new JsonResult(500,e.getMessage());
return json;
}
--------------- 404异常
springBoot404异常处理很简单
只需要创建一个error文件夹并且将404页放入其中命名为404.html即可
可简单的进行测试!!!
测试
ajax异常处理
//ajax报错
@RequestMapping("/ajaxjson")
@ResponseBody
public JsonResult ajaxjson(int n) throws AjaxException {
try {
int ok=9/n;
}catch (Exception e){
throw new AjaxException("ajax查询失败");
}
return new JsonResult(200,"ajax查询成功");
}
运行得到ajax报错后的数据
成功则不进入错误异常
500异常测试也是一样的:
//测试普通报错
@RequestMapping("/putong")
public String putong(int n){
int ok=1/n;
return "users/index";
}
只要n不等于0就不会报错
测试结果…
n=0
n!=0
404异常处理
项目中没有该路径即会跳转到404页
拦截器
创建一个拦截器LoginInterceptor
拦截器实现接口 handlerinterceptor
/**
* 拦截器测试
*/
@Component
public class LoginInterceptor implements HandlerInterceptor {
//拦截前
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//检查session 标志 判断是否拦截
System.out.println("拦截器触发成功...");
return true;
}
}
创建一个配置类即可加上注释@Configuration
/**
* 配置类
* 1、全网站跨域 2、拦截器
*/
@Configuration
public class WebConfig implements WebMvcConfigurer {
//拦截器
@Autowired
LoginInterceptor login_lj;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(login_lj)
.addPathPatterns("/**")
.excludePathPatterns("/login"); //不拦截的路径
}
}
跨域
加在配置类中和过滤器一样
//跨域
@Override
public void addCorsMappings(CorsRegistry registry) {
//所有网站支持跨域
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("GET","HEAD","POST","PUT","DELETE","OPTIONS","PATCH")
// .allowCredentials(true) //是否允许授权
.maxAge(3600)
.allowedHeaders("*");
}