@Component
@Slf4j
@Scope("prototype")
public class OAuth2Filter extends AuthenticatingFilter {
@Autowired
private ThreadLocalToken localToken;
@Value("${-expire}")
private int cacheExpire;
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private JwtUtil jwtUtil;
/**
* 返回封装好的token对象
* @param servletRequest
* @param servletResponse
* @return
* @throws Exception
*/
@Override
protected AuthenticationToken createToken(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String token = getRequestToken(httpServletRequest);
if((token)){
return null;
}
return new OAuth2Token(token);
}
/**
* 放行options请求
* @param request
* @param response
* @param mappedValue
* @return
*/
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
("这是isAccessAllowed方法");
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
if (().equals(RequestMethod.OPTIONS.name())){
("这是isAccessAllowed方法中的true");
return true;
}
("这是isAccessAllowed方法中的true");
return false;
}
@Override
protected boolean onAccessDenied(ServletRequest servletRequest, ServletResponse servletResponse) throws Exception {
("这是onAccessDenied方法");
HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse)servletResponse;
("text/html");
("UTF-8");
("Access-Control-Allow-Headers", "Accept,Origin,X-Requested-With,Content-Type,X-Auth-Token,token");
("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACES");
// ("Access-Control-Max-Age", "3600");
("Access-Control-Allow-Credentials", "true");
("Access-Control-Allow-Origin", ("Origin"));
();
String token = getRequestToken(httpServletRequest);
if((token)){
("这是onAccessDenied方法-----token是空的");
(HttpStatus.SC_UNAUTHORIZED);
().println("无效的令牌!");
return false;
}
try{
("这是onAccessDenied方法-----检查token");
(token);
}catch (TokenExpiredException tokenExpiredException){
if((token)){
("这是onAccessDenied方法-----token过期刷新");
redisTemplate.delete(token);
int userId = (token);
token = (userId);
().set(token,userId+"",cacheExpire, );
(token);
}else{
(HttpStatus.SC_UNAUTHORIZED);
().println("令牌已经过期!");
return false;
}
}catch (Exception exception){
(HttpStatus.SC_UNAUTHORIZED);
().println("无效的令牌!");
return false;
}
boolean bool = executeLogin(servletRequest,servletResponse);
return bool;
}
@Override
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
("这是onLoginFailure方法");
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
("text/html");
("UTF-8");
("Access-Control-Allow-Headers", "Accept,Origin,X-Requested-With,Content-Type,X-Auth-Token,token");
("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACES");
// ("Access-Control-Max-Age", "3600");
("Access-Control-Allow-Credentials", "true");
("Access-Control-Allow-Origin", ("Origin"));
try{
().print(());
}catch (IOException ioException){
}
return false;
}
private String getRequestToken(HttpServletRequest httpServletRequest){
String token = ("token");
("Oauth2filter---getRequestToken---header "+token);
if((token)){
token = ("token");
("Oauth2filter---getRequestToken---param "+token);
}
return token;
}
@Override
public void doFilterInternal(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
("这是doFilterInternal方法");
HttpServletRequest httpServletRequest = (HttpServletRequest)request;
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
("text/html");
("UTF-8");
("Access-Control-Allow-Headers", "Accept,Origin,X-Requested-With,Content-Type,X-Auth-Token,token");
("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACES");
// ("Access-Control-Max-Age", "3600");
("Access-Control-Allow-Credentials", "true");
("Access-Control-Allow-Origin", ("Origin"));
super.doFilterInternal(request, response, chain);
}
}