先自定义异常继承Exception
package com.example.demo.exception;
public class MyException extends Exception{
private String code;
private String msg;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public MyException(String code, String msg) {
this.code = code;
this.msg = msg;
}
public MyException() {
}
}
创建自定义异常页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
报错了
</body>
</html>
全局异常处理和自定义异常的处理
package com.example.demo.exception;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@RestControllerAdvice
public class GolbException {
@ExceptionHandler(Exception.class)
public Object exec1(Exception e, HttpServletRequest request){
Map map=new HashMap();
map.put("code","500");
map.put("msg",e.getMessage());
map.put("url",request.getRequestURL());
return map;
}
@ExceptionHandler(MyException.class)
public Object exec2(MyException e, HttpServletRequest request){
ModelAndView mv=new ModelAndView();
mv.addObject("code",e.getCode());
mv.addObject("msg",e.getMessage());
mv.setViewName("error");
return mv;
}
}
控制层
@GetMapping("/exce1")
@ResponseBody
public Map findTest1(){
Map map=new HashMap();
map.put("aa","111");
int a=1/0;
return map;
}
@GetMapping("/exce2")
public UserInfo findTest2() throws MyException{
throw new MyException("666","嘿嘿嘿");
}
访问之后引发全局异常返回 全局异常的内容
这里调用的是自定义异常的内容
拦截器
定义类 实现 HandlerInterceptor 的方法 并重写里面的方法 idea可以使用ctrl+o来重写方法
package com.example.demo.interceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class LoginIntercepter implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行业务逻辑前");
String ui=(String) request.getSession().getAttribute("ui");
if (ui!=null){
return true;
}else {
response.sendRedirect("/login.html");
return false;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
System.out.println("执行业务逻辑后,视图渲染之前");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
System.out.println("视图渲染后");
}
}
定义类 配置拦截器
@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>
,作用为:配置spring容器(应用上下文)
package com.example.demo.interceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@Configuration
public class GolbeIntercepter implements WebMvcConfigurer {
@Resource
private LoginIntercepter loginIntercepter;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//加载拦截器 addPathPatterns("/**")表示拦截所有 excludePathPatterns表示不拦截
registry.addInterceptor(loginIntercepter).addPathPatterns("/**")
.excludePathPatterns("/login").excludePathPatterns("/**/login.html");
}
}
创建登录页面
<!DOCTYPE html>
<html lang="en" xmlns="http://www.w3.org/1999/html">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
user<input type="text" name="name"></br>
pas<input type="text" name="pass"></br>
<input type="submit" value="登录">
</form>
</body>
</html>
创建登陆成功的页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
进来了
</body>
</html>
书写控制层代码
@PostMapping("/login")
public String login(String name,String pass,HttpServletRequest request){
if (name.equals("zzp")&&pass.equals("123")){
request.getSession().setAttribute("ui",name);
return "success";
}else {
return "error";
}
}
首先进来login.html页面 我们在这里配置的不拦截login.html
提交登录 错误进error页面
提交登录 错误进error页面