springboot拦截器案例:登录

需要掌握:springmvc拦截器

例子

实现校验登录拦截器,访问 Controller 时,要校验是否登录

拦截器

@Component
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        boolean res=false;
        HttpSession session=request.getSession();
        UserModel um=(UserModel)session.getAttribute("userInfo");

        if(um!=null) {
            res = true;
        }else {
            //如果没有登录,就转发到/toLogin
            request.getRequestDispatcher("/toLogin").forward(request,response);
            res = false;
        }
        return res;
    }

}

toLogin

@RestController
public class LoginCtrl {

    @RequestMapping("/toLogin")
    public JsonResult toLogin(){
        JsonResult jr=new JsonResult(300,"请登录");
        return jr;
    }
}

优点

当没有登录,就转发到 /toLogin(通过 Controller),优点如下:

  1. Controller 返回 json 更加简单。
    在拦截器中也可以直接输出 json ,但需要额外处理

  2. 通过 Controller 实现跨域更加简单。
    在拦截器中实现跨域时,需要做更多的额外处理

JsonResult 类

@JsonInclude(JsonInclude.Include.NON_NULL)
public class JsonResult<T> {

    protected int code;
    protected String msg;
    protected T data;

    public JsonResult() {

    }
    public JsonResult(int code,String msg){
        this.code=code;
        this.msg=msg;
    }
    public JsonResult(int code,T data){
        this.code=code;
        this.data=data;
    }
    public JsonResult(int code,String msg,T data){
        this.code=code;
        this.msg=msg;
        this.data=data;
    }

    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMsg() {
        return msg;
    }
    public void setMsg(String msg) {
        this.msg = msg;
    }
    public T getData() {
        return data;
    }
    public void setData(T data) {
        this.data = data;
    }

}

配置类 springboot2.x写法

使用配置类加载拦截器:

package top.malaoshi.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import top.malaoshi.interceptors.LoginInterceptor;


@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/login.html","/login","/toLogin","/js/**","/css/**","/img/**","/favicon.ico");
    }
}

解释:

  • /**:访问url /下的资源,及 子路径下的资源,包括:Controller,静态资源 如 js、css、图片 等,均会 拦截

  • excludePathPatterns() 表示不拦截的url:

    • /login:登录Controller,不拦截,否则无法登录

    • /js/**:该url下都是js,不需要登录校验,所以不拦截

    • /css/**:该url下都是css,不需要登录校验,所以不拦截

    • /img/**:该url下都是图片,不需要登录校验,所以不拦截

springboot拦截器 /** 和 /* 区别

配置类 springboot1.x写法

在springboot1.x中,默认不拦截 静态资源,所以不需要像上面那样加上不拦截js、css、img的代码

package top.malaoshi.conf;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;
import top.malaoshi.interceptors.LoginInterceptor;


@Configuration
public class SpringMVCConfig implements WebMvcConfigurer {

    @Autowired
    private LoginInterceptor loginInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor).addPathPatterns("/**")
                .excludePathPatterns("/login");
    }
}

原文出处:/show_1EF5rcqjTdOJ.html