引言
我们自定一个拦截器,只有当用户登录后,才可以访问资源接口(会员、商品、供应商、员工),没有登录则要求 登录。
其中判断是否登录,要求客户端请求接口时,在请求头上带上 token ,然后在拦截器拦截到请求后,校验 token是否有效,有效才让访问,否则无法访问。
请求头信息 Authorization: Bearer jwtToken
创建拦截器
- 创建一个 HandlerInterceptorAdapter 拦截适配器的子类,并且重写它里面的 preHandle 方法,在请求目标接口时进行拦截。
- 创建自定义拦截器类 com.mengxuegu.member.filter.AuthenticationFilter
类上不要少了 @Component
package com.mengxuegu.member.filter;
import com.mengxuegu.member.util.jwtUtil;
import io.jsonwebtoken.Claims;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//认证拦截器
@Component //添加到容器
public class AuthenticationFilter extends HandlerInterceptorAdapter {
@Autowired
private jwtUtil jwtUtil;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 是否登录
boolean isLogin=false;
// 请求头带上令牌 Authorization :Bearer token
final String authHeader = request.getHeader("Authorization");
if(StringUtils.isNotBlank(authHeader) && authHeader.startsWith("Bearer ")){
// 截取token
final String token=authHeader.substring(7);
// 解析token
Claims claims = jwtUtil.parseJWT(token);
if(claims!=null){ //防止空指针异常
// 是否登录
Boolean b= (Boolean)claims.get("isLogin");
if(b){
// 已经登录,放行请求
isLogin=true;
}
}
}
if(!isLogin){
// 未登录,则响应信息
response.setContentType("application/json;charset=UTF-8");
response.setCharacterEncoding("UTF-8");
response.setStatus(401);
response.getWriter().write("未通过认证,请在登录页进行登录");
}
// 不放行
return isLogin;
}
}
配置拦截器
1.创建一个配置类 com.mengxuegu.member.config.WebMvcConfig
其中要放行登录请求 /user/login
package com.mengxuegu.member.config;
import com.mengxuegu.member.filter.AuthenticationFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
@Configuration
public class WebMvcConfig extends WebMvcConfigurationSupport {
@Autowired
private AuthenticationFilter authenticationFilter;
// 注入拦截器
@Override
protected void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(authenticationFilter)
// 拦截所有请求
.addPathPatterns("/**")
// 排除登录请求
.excludePathPatterns("/user/login");
}
}
客户端请求头带上token
ruquest中