1、自定义一个过滤器
1、定义一个过滤器的类AuthenticationFilter 继承HandlerInterceptorAdapter 类
2、右键Generate->重写父类的方法preHandle(),如果返回false则不能访问,返回true则可以访问
3、定义令牌的请求头
//请求带上令牌,Authorization:Bearer token
final String header = request.getHeader("Authorization");
4、判断请求头是否为空,判断请求体是否为空
header.startsWith这个判断请求体是不是以XXX开头
if (StringUtils.isNotBlank(header) && header.startsWith("Bearer "))
5、获取请求体的中包含的token值
header.substring(7);从string类型的字符串第七个以后开始取值,包含空格,Bearer六个字母,加空格为七个
//截取token,从第七个开始截取
String token = header.substring(7);
6、将token值转化为信息,看看token是否失效
Claims claims = jwtUtils.parseJWT(token);
if (claims != null) {
//强类型转换
Boolean login = (Boolean) claims.get("isLogin");
if (login) {
isLogin = true;
}
}
7、失效返回 isLogin,isLogin 是布尔类型,上面设置默认为false
8、 如果失效则向前端返回自定义信息
if (!isLogin) {
response.setContentType("application/json;charset=UTF-8");
//设置编码格式
response.setCharacterEncoding("UTF-8");
response.setStatus(401);
response.getWriter().write("未通过登录认证,请在登录页面登录");
}
9、将过滤器注册到Spring中
@Component
public class AuthenticationFilter extends HandlerInterceptorAdapter {
@Component
public class AuthenticationFilter extends HandlerInterceptorAdapter {
/**
* 覆盖父类的方法,
* 如果返回true则可以调用方法,
* 如果返回false则不调用
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Autowired
private JwtUtils jwtUtils;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
boolean isLogin = false;
//请求带上令牌,Authorization:Bearer token
final String header = request.getHeader("Authorization");
//判断key是否为空,判断value的前部是不是Bearer开头
if (StringUtils.isNotBlank(header) && header.startsWith("Bearer ")) {
//截取token,从第七个开始截取
String token = header.substring(7);
Claims claims = jwtUtils.parseJWT(token);
if (claims != null) {
//强类型转换
Boolean login = (Boolean) claims.get("isLogin");
if (login) {
isLogin = true;
}
}
}
if (!isLogin) {
response.setContentType("application/json;charset=UTF-8");
//设置编码格式
response.setCharacterEncoding("UTF-8");
response.setStatus(401);
response.getWriter().write("未通过登录认证,请在登录页面登录");
}
return isLogin;
}
}
2添加web过滤器
1、添加web 过滤器,管理过滤的类,以及过滤的请求路径
2、继承WebMvcConfigurationSupport 类
和上面一样Generate,复写父类的方法 addInterceptors
3、通过registry.addInterceptor拦截类,addPathPatterns拦截路径,excludePathPatterns添加允许路径
@Component
public class WebConfig extends WebMvcConfigurationSupport {
@Autowired
private AuthenticationFilter authenticationFilter;
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationFilter)
.addPathPatterns("/**")
.excludePathPatterns("/user/login");
}
}