自定义异常 继承Exception
package com.zhf.demoboot3_31.exception;
public class MyException extends Exception{
private String code;
private String msg;
public MyException() {
}
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;
}
}
全局异常处理和自定义异常的处理
package com.zhf.demoboot3_31.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 //Advice通知的意思
public class GolbException {
/**
* 以json格式返回
* @param e
* @param request
* @return
*/
@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.getRequestURI());
return map;
}
/**
* 跳转路径 --页面返回
* @param e
* @param request
* @return
*/
@ExceptionHandler(MyException.class)
public Object exec2(MyException e, HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("code",e.getCode());
modelAndView.addObject("msg",e.getMessage());
modelAndView.setViewName("error");
return modelAndView;
}
}
异常请求
package com.zhf.demoboot3_31.contorller;
import com.zhf.demoboot3_31.entity.UserInfo;
import com.zhf.demoboot3_31.exception.MyException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@Controller
public class TestContorller {
@Autowired
private UserInfo userInfo;
@GetMapping("/exec1")
@ResponseBody
public UserInfo findTest1(){
int a=1/0;
return userInfo;
}
@GetMapping("/exec2")
public UserInfo findTest2() throws MyException {
throw new MyException("500","余额不足,转账失败");
}
}
页面
全局异常 以json格式返回
自定义异常跳转页面
拦截器
自定义实体类 加@Component交给sprng去处理
package com.zhf.demoboot3_31.entity;
import org.springframework.stereotype.Component;
@Component
public class UserInfo {
private String name;
private String pass;
public UserInfo() {
}
public UserInfo(String name, String pass) {
this.name = name;
this.pass = pass;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
定义类 实现 HandlerInterceptor 的方法
package com.zhf.demoboot3_31.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 LoginInterceter implements HandlerInterceptor {
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行业务逻辑后,视图渲染前");
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("执行业务逻辑前");
String ui = (String) request.getSession().getAttribute("ui");
System.out.println("=========="+ui);
if (ui != null) {
return true;
}else {
response.sendRedirect("login.html");
return false;
}
// return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("1执行业务逻辑之后,视图渲染之后,被执行");
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
定义类 配置拦截器
@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>
,作用为:配置spring容器(应用上下文)
package com.zhf.demoboot3_31.interceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class GolbeInterceter implements WebMvcConfigurer {
@Autowired
private LoginInterceter loginInterceter;
public LoginInterceter loginInterceter() {
return loginInterceter;
}
public void setLoginImterceter(LoginInterceter loginInterceter) {
this.loginInterceter = loginInterceter;
}
/**
*拦截器的配置类
* 配置什么不拦
* 什么拦截
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
//1、加载拦截器 addPathPatterns表示/**拦截所有, excludePathPatterns表示不拦截
registry.addInterceptor(loginInterceter).addPathPatterns("/**")
.excludePathPatterns("/login").excludePathPatterns("/**/login.html");
}
}
登录页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<form action="/login" method="post">
user<input type="text" name="name" /></br>
pass<input type="text" name="pass" /></br>
<input type="submit" value="提交">
</form>
</body>
</html>
处理登录请求
@PostMapping("/login")
public String login(String name, String pass, HttpServletRequest request){
System.out.println(name+pass);
if (name.equals("zhf")&&pass.equals("123")){
request.getSession().setAttribute("ui", name);
return "success";
}else {
return "error";
}
}
测试页面
直接访问测试页面,拦截成功!
--------------------------------------------------------------------------------------------------------------------------
提交登录 错误进error页面
提交登录 成功进success页面