如何前后端分离的架构中使用Shiro框架
public class AuthenticFilter extends AuthenticatingFilter {
public final static String TOKEN="token";
@Override
protected AuthenticationToken createToken(ServletRequest request, ServletResponse response) throws Exception {
String token=getRequestToken((HttpServletRequest) request);
if(StringUtils.isBlank(token)){
return null;
}
return new AuthenticToken(token);
}
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
String token=getRequestToken((HttpServletRequest) request);
if(StringUtils.isBlank(token)){
HttpServletResponse httpReponse= (HttpServletResponse) response;
httpReponse.setHeader("Access-Control-Allow-Credentials","true");
httpReponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getHeader("Origin"));
httpReponse.getWriter().print(JSON.toJSONString(ResponseVo.error(HttpStatus.SC_UNAUTHORIZED,"invalid token")));
return false;
}
return executeLogin(request,response);
}
@Override
protected boolean onLoginFailure(AuthenticationToken token, AuthenticationException e, ServletRequest request, ServletResponse response) {
HttpServletResponse httpResponse= (HttpServletResponse) response;
httpResponse.setContentType("application/json;charset=utf-8");
httpResponse.setHeader("Access-Control-Allow-Credentials", "true");
httpResponse.setHeader("Access-Control-Allow-Origin", HttpContextUtils.getHeader("Origin"));
try {
Throwable throwable=e.getCause();
//()
ResponseVo responseVo=ResponseVo.error(HttpStatus.SC_UNAUTHORIZED,null);
httpResponse.getWriter().print(JSON.toJSON(responseVo));
} catch (IOException e1) {
e1.printStackTrace();
}
return false;
}
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
if(RequestMethod.OPTIONS.name().equals(((HttpServletRequest) request).getMethod())){
return true;
}
return false;
}
private String getRequestToken(HttpServletRequest request){
String token=request.getHeader(TOKEN);
if(StringUtils.isBlank(token)){
token=request.getParameter(TOKEN);
}
return token;
}
}