注册一个拦截器
public class ApiApplication implements WebMvcConfigurer
//实现接口中的方法注册的拦截器名称 及拦截路径
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
具体的代码为
package com.qbsea.mysboot2shirojwt;
import com.qbsea.mysboot2shirojwt.common.interceptor.MyInterceptor;
import com.qbsea.mysboot2shirojwt.common.mybatis.entities.customed.TUserJwtshiroSub;
import com.qbsea.mysboot2shirojwt.common.mybatis.entities.generated.TUserJwtshiro;
import com.qbsea.mysboot2shirojwt.common.mybatis.mapper.customed.TUserJwtshiroSubMapper;
import com.qbsea.mysboot2shirojwt.common.utils.qbseaapi.QbseaApi;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import retrofit2.Call;
import java.io.IOException;
@SpringBootApplication
@MapperScan(basePackages = "com.qbsea.mysboot2shirojwt")
public class ShiroJwtMain implements WebMvcConfigurer {
public static void main(String[] args) throws IOException {
ConfigurableApplicationContext context = SpringApplication.run(ShiroJwtMain.class, args);
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
}
}
MyInterceptor的详情
1.extends HandlerInterceptorAdapter
2.实现方法preHandle //做具体请求之前拦截 或者做一些存储与计数相关的
3.实现方法afterCompletion //完成请求之后的拦截
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Date;
public class MyInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
MyModel myModel = new MyModel();
myModel.setUserId("1");
myModel.setUsername("maqingbin");
myModel.setStartDate(new Date());
MyThreadLocal.setCurrent(myModel);
return super.preHandle(request, response, handler);
//还何以做一些业务的处理然后返回
//--------------------------
if(!"0000".equals(resultCallVo.getCode())){//token校验失败
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
PrintWriter out = null ;
JSONObject res = new JSONObject();
res.put("code","9999");
res.put("msg",resultCallVo.getAlertErrMsg());
out = response.getWriter();
out.append(res.toString());
return false;
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex)
throws Exception {
super.afterCompletion(request, response, handler, ex);
MyModel myModel = MyThreadLocal.current();
Date endDate = new Date();
long between = endDate.getTime()-myModel.getStartDate().getTime();
System.out.println("-----本次请求用了----"+(between/1000)+"s");
}
}
ThreadLocal的使用
可以把一些常用的变理放入threadLocal里,用到的地方直接拿到来取
package com.qbsea.mysboot2shirojwt.common.interceptor;
import java.io.Serializable;
public class MyThreadLocal implements Serializable {
private static final ThreadLocal<MyModel> CURRENT = new ThreadLocal<>();
public static MyModel current() {
return CURRENT.get();
}
static void setCurrent(MyModel myModel) {
CURRENT.set(myModel);
}
static void clear() {
CURRENT.remove();
}
}