springboot_拦截器

注册一个拦截器

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();
	}
}

具体的使用的地方

猜你喜欢

转载自blog.csdn.net/maqingbin8888/article/details/83143942
今日推荐