需要掌握: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),优点如下:
Controller 返回 json 更加简单。
在拦截器中也可以直接输出 json ,但需要额外处理通过 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");
}
}
