58 lines
2.1 KiB
Plaintext
58 lines
2.1 KiB
Plaintext
package com.bonus.core.jwt;
|
||
|
||
import org.apache.shiro.authz.UnauthorizedException;
|
||
import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter;
|
||
|
||
import com.bonus.core.StringHelper;
|
||
|
||
import io.jsonwebtoken.Claims;
|
||
|
||
import java.util.Date;
|
||
|
||
import javax.servlet.ServletRequest;
|
||
import javax.servlet.ServletResponse;
|
||
import javax.servlet.http.HttpServletRequest;
|
||
import javax.servlet.http.HttpServletResponse;
|
||
|
||
public class JwtFilter extends BasicHttpAuthenticationFilter {
|
||
|
||
|
||
@Override
|
||
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object mappedValue) {
|
||
|
||
HttpServletResponse response = (HttpServletResponse) servletResponse;
|
||
response.setContentType("application/pdf");
|
||
response.setHeader("Access-Control-Allow-Origin", "*");
|
||
response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
|
||
response.setHeader("Access-Control-Allow-Headers", "Authorization");
|
||
response.setHeader("Access-Control-Max-Age", "0");
|
||
HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
|
||
// 自定义JWT验证逻辑
|
||
String token = httpRequest.getHeader("Authorization");
|
||
|
||
if (StringHelper.isNotEmpty(token) && token.startsWith("Bearer ")) {
|
||
token = token.substring(7); // 去掉"Bearer "
|
||
|
||
JwtUtil jwtUtil = new JwtUtil();
|
||
Claims claims = jwtUtil.parseToken(token);
|
||
if (claims == null || claims.getExpiration().before(new Date())) {
|
||
throw new UnauthorizedException("Token已过期或无效");
|
||
}else{
|
||
return true;
|
||
}
|
||
}else{
|
||
return false;
|
||
}
|
||
// 如果验证通过,返回true;否则返回false
|
||
}
|
||
|
||
@Override
|
||
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
|
||
// 验证失败处理逻辑
|
||
// ...
|
||
// 你可以在这里设置响应状态码、响应体等
|
||
return false;
|
||
}
|
||
|
||
}
|