实现拦截器的方式有好多种 这里我分享一种实现
HandlerInterceptor接口的方式 费话不多说 上代码
以登录拦截为例子
1、实现接口 LoginInterceptor implements HandlerInterceptor
2、重写preHandler
String accessToken = request.getHeader("token");
if(accessToken == null){
accessToken = request.getParameter("token");
}
if (accessToken != null ) {
Claims claims = JWTUtils.checkJWT(accessToken);
Integer id = (Integer)claims.get("id");
String name = (String)claims.get("name");
request.setAttribute("user_id",id);
request.setAttribute("name",name);
//普通用户
return true;
}
return false;
以上1、2点形成的类
package com.cm.weixin.pay.interceoter;
import com.cm.weixin.pay.domain.JsonData;
import com.cm.weixin.pay.utils.JwtUtils;
import com.github.pagehelper.StringUtil;
import com.google.gson.Gson;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class LoginIntercepter implements HandlerInterceptor {
private static final Gson gSon=new Gson();
/**
* 进入controller之前进行拦截
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("token");
if(token==null){
token=request.getParameter("token");
}
if(token!=null){
Claims claims=JwtUtils.checkJwt(token);
Integer userid= (Integer) claims.get("id");
String name = (String) claims.get("name");
request.setAttribute("user_id",userid);
request.setAttribute("name",name);
return true;
}
sendJsonMessage(response, JsonData.buildError("请登录"));
return false;
}
/**
* 相应数据给前端
*/
public static void sendJsonMessage(HttpServletResponse response,Object obj){
response.setContentType("application/json;charset=utf-8");
PrintWriter writer = null;
try {
writer = response.getWriter();
} catch (IOException e) {
e.printStackTrace();
}
writer.print(gSon.toJson(obj));
writer.close();
try {
response.flushBuffer();
} catch (IOException e) {
e.printStackTrace();
}
}
}
3、配置拦截器
此配置主要是根据url进行拦截 可以自行配置灵活运用
@Configuration
InterceptorConfig implements WebMvcConfigurer
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/api/v1/*/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
完整的配置类
package com.cm.weixin.pay.config;
import com.cm.weixin.pay.interceoter.LoginIntercepter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* 拦截器配置
*/
@Configuration
public class IntercepterConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginIntercepter())
.addPathPatterns("/user/api/v1/*/**");
WebMvcConfigurer.super.addInterceptors(registry);
}
}
4、贴出做测试的类
package com.cm.weixin.pay.controller;
import com.cm.weixin.pay.domain.JsonData;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user/api/v1")
public class OrderController {
@RequestMapping("add")
public JsonData saveOrder(){
return JsonData.buildSuccess("下单成功");
}
}
本文结尾:在1、2点形成的类里面我贴出的第二个方法是响应前端数据的一种写法 此写法我自认为很好用 请自行测试脑补!