Springboot的拦截器与自定义异常路径

首先是异常,你可以自定义异常。

首先写一个实体类类,让他继承异常,你可以在里面写类型。记得写构造方法和有参无参。

public class MyException extends Exception{
    private String code;
    private String msg;

再写一个全局异常处理。这里面的内容就是这,json的是处理当前程序异常,另一个是处理业务异常。@ExceptionHandler是异常的注解,@RestControllerAdvice通知注解

//通知
@RestControllerAdvice
public class GolbExceprion {
    /**
     * 以json返回异常
     * @return
     */
    @ExceptionHandler(Exception.class)
    public Object exception1(Exception e, HttpServletRequest request){
    Map map=new HashMap();
    map.put("code",500);
    //获取到异常信息
    map.put("msg",e.getMessage());
    //获取你的请求路径
    map.put("url",request.getRequestURL());
    return map;
    }

    /**
     * 以页面返回异常
     * @return
     */
    @ExceptionHandler(MyException.class)
    public Object exception1(MyException my,HttpServletRequest request){
        ModelAndView mv=new ModelAndView();
        mv.addObject("code",my.getCode());
        mv.addObject("msg",my.getMsg());
        mv.setViewName("erro");
        return mv;
    }
}

然后你可以写一个实体类,@Component这个注解是让折这个实体类去让spring去管理

@Component
public class ExcptionInfo {
    private String name;
    private String password;

最后写一个控制器,把这个实体类属性注入进来,
//异常让他返回的是json形式的异常
@GetMapping(value = "/textexc")
@ResponseBody
public ExcptionInfo Text1(){
    int i=1/0;
    return excptionInfo;
}


//自定义异常
@GetMapping(value = "/textexc2")
public ExcptionInfo Text2() throws MyException {
    throw new MyException("500","没有钱了");
}

---------------------------------------------------------------------------------------------------------------------------------拦截器,这里面使用登录来演示了,这个登录的页面,我是写在了static里面,直接就能访问

用户名:
密码:

首先创建一个全局拦截器的类,让他继承这个HandlerInterceptor,然后使用它里面的三个方法,在把这个类上面配置一个注解,@Component,把他交给Springboot来管理,省的接下来new这个类。

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    System.out.println("执行业务逻辑之前执行");
    //拿到前台输入框的值
    String username = request.getParameter("username");
    if(username!=null){
        //如果不为空的话就继续执行
        return true;
    }else{
        //如果为空的话就重定向到登陆界面,
        response.sendRedirect("login.html");
        return false;
    }

}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    System.out.println("执行业务逻辑后,视图渲染前执行");
}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    System.out.println("视图渲染后执行");
}

因为SSM中的拦截器都是配置在Springmvc里面的,Springboot里面没有Springmvc,这次的拦截器的配置文件卸载类里面,接下来要写一个类,让他继承这个拦截器的接口 WebMvcConfigurer。因为这个类是要配置拦截器的,所以要加上一个拦截器的注解@Configuration。做完这些,开始配置拦截什么,

在这里你要实现一个WebMVcConfigurer里面的一个方法,在这个方法里面写拦截什么,在这个方法里面,就用到了。上面写的交给Springboot管理全局拦截器的类,把他注入进去

public void addInterceptors(InterceptorRegistry registry) {}
@Configuration
public class GolbExcecepter implements WebMvcConfigurer {
//注入了全局拦截器的类,然后写他的set,get方法
   @Resource
    private LoginIntercepter loginIntercepter;

    public LoginIntercepter getLoginIntercepter() {
        return loginIntercepter;
    }

    public void setLoginIntercepter(LoginIntercepter loginIntercepter) {
        this.loginIntercepter = loginIntercepter;
    }

    /**
     * 拦截器的配置类,配置什么拦截,什么不拦截
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //1.加载拦截器,addPathPatterns=/**拦截所有,.excludePathPatterns不拦截
        registry.addInterceptor(loginIntercepter).addPathPatterns("/**")
                 //登录的请求不能拦截,登录页面也不能拦截。
                // "/**/*.html"这种写法是所有的页面都不拦截,
                // "/**/login.html"这种写法是,除了登录的页面不拦截,其他的页面都拦截
        .excludePathPatterns("/deng").excludePathPatterns("/**/login.html");
    }
}

做完这些后,就开始写控制器的方法了,在这里我是给了他一个固定的参数。

 @PostMapping(value ="/deng")
    public String login(String username, String password, HttpServletRequest request){
        if(username.equals("zwh")&&password.equals("123")){
            request.getSession().setAttribute("ui",username);
            return "show";
        }else{
            return "erro";
        }
    }
}

以上就是拦截器的基本使用和介绍。

你可能感兴趣的:(笔记,spring)