@Slf4j
@Component
@WebFilter(urlPatterns = "/platform/*")
public class AuthFilter extends OncePerRequestFilter {
@Autowired
private ResourceAuthService authService;
/**
* 在这里对用户和对应的url权限进行校验
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
HttpRequestWrapper requestWrapper = new HttpRequestWrapper(request);
HttpResponseWrapper responseWrapper = new HttpResponseWrapper(response);
String userName = request.getHeader(USER_NAME);
ApplicationContext.setUserName(userName);
// 用户没有权限
if (!authService.userHaveAuth(userName, requestWrapper)) {
responseWrapper.setBody(generateNoAuth());
} else {
filterChain.doFilter(requestWrapper, responseWrapper);
}
//输出 response stream
responseWrapper.copyToResponse();
}
private String generateNoAuth() {
Response<?> response = new Response<>();
response.setErrCode(FORBIDDEN.value());
response.setErrMsg("没有权限");
return JSON.toJSONString(response);
}
}
response head 放置数据失效
注意
后来发现就是给response中的head添加数据的时候不生效,看了下面这篇文章之后才知道,response中的head在调用链处理之后,其中的head部分是会被放到Buffer里面的,这样在doFilter之后进行处理,里面的东西就不是一个了,因此,通常情况下,可以将addHead部分放到doFilter的上面