逻辑
ps:本次代码无法使用统一异常处理
1、部分接口设置白名单,从而不走自定义Filter
2、其余所有的接口请求都要走自定义Filter
3、所有的Shiro异常都用自定义异常
4、当捕捉到异常后,用一次请求转发,来将异常返回给前端。
引入包:shiro-redis。目前来看shiro-redis和单独的shiro差不多
前后端分离。
使用的Shiro网上找一下配置,大同小异。
image.png
问题记录
1、白名单配置异常
ShiroConfig中配置白名单时,可能没有效果。原因是ShiroConfig的配置问题。
PS:在网络上的有些文档中,不会出这种问题。
解决:
需要在添加过滤器的配置中,加入原本Shiro自带的过滤器
image.png添加白名单配置如下:
image.png
2、抛出异常报错。使用PostMan进行测试时,返回一个html
解决:重写isAccessAllowed
网上大部分的代码不是重写这个,就是重写onAccessDenied。
从Debug、其他资料看得出二者的关系是,is先行,按照is执行情况来执行on。当is返回true,不执行OnAccessDenied。
这里有三个重要自定义
1、ServiceException,一个自定义Exception,用这个Exception,来抛出所有的异常,比如token过期、用户不存在等等等等。【全部在Realm中处理】
2、将异常转发到接口,即执行executeLogin碰到的接口
3、executeLogin。在Realm中进行处理,分权限或者登录的处理了。目前只试过登录
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
try {
executeLogin(request, response);
} catch (Exception e) {
ServiceException e1 = (ServiceException) e.getCause();
// 转发异常到自定义接口
responseError(response, e1.getMessage(), e1.getCode());
}
return true;
}
@Override
protected boolean executeLogin(ServletRequest request, ServletResponse response) {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
String authorization = getAuthorization(httpServletRequest); // 自定义取token。放Header就取Header
JwtToken jwtToken = new JwtToken(authorization);
getSubject(request, response).login(jwtToken); // 调用Realm来进行处理
return true;
}
/**
* 异常处理,转发数据到接口
* 重定向的接口,需要添加到白名单
*/
private void responseError(ServletResponse response, String message, int errCode) {
try {
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
message = URLEncoder.encode(message, "UTF-8");
httpServletResponse.sendRedirect("/user/shiro/error/" + message + "/" + errCode);
} catch (IOException e) {
log.error(e.getMessage());
}
}
网友评论