【发布时间】:2015-08-01 09:24:17
【问题描述】:
我有一个 REST 接口,它通过 jquery-Ajax-Requests 从前端代码调用。调用的 url 使用以下 shiro.ini 保护:
/api/** = authc
如果用户未通过身份验证,Shiro 想要重定向到 login-Url,而 ajax-Request 无法处理。我更喜欢 HTML 状态代码作为答案。 实现这一目标的最佳方法是什么?感谢您的任何回答!
【问题讨论】:
我有一个 REST 接口,它通过 jquery-Ajax-Requests 从前端代码调用。调用的 url 使用以下 shiro.ini 保护:
/api/** = authc
如果用户未通过身份验证,Shiro 想要重定向到 login-Url,而 ajax-Request 无法处理。我更喜欢 HTML 状态代码作为答案。 实现这一目标的最佳方法是什么?感谢您的任何回答!
【问题讨论】:
回答问题:
如何配置我的应用程序上下文,告诉他使用这个自定义 shiro 过滤器?
应用程序上下文将从 shiro.ini 文件中获取更改。在其 [main] 部分定义自定义过滤器,并在适用的 URL 模式的 [urls] 部分中使用它。
[main]
myLocalhostFilter = my.package.LocalhostFilter
...
[urls]
...
/api/** = myLocalhostFilter
【讨论】:
您需要实现自定义 shiro 过滤器。 像这样的:
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException ;
import javax.servlet.http.HttpServletResponse ;
import org.apache.shiro.web.filter.authz.AuthorizationFilter ;
import org.apache.shiro.web.util.WebUtils ;
public class LocalhostFilter extends AuthorizationFilter {
private static final String message = "Access denied.";
@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
//do something when access allowed
return true;
}
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws IOException {
HttpServletResponse httpResponse ;
try { httpResponse = WebUtils.toHttp(response); }
catch (ClassCastException ex) {
// Not a HTTP Servlet operation
return super.onAccessDenied(request, response) ;
}
if ( message == null )
httpResponse.sendError(403) ;
else
httpResponse.sendError(403, message) ;
return false ; // No further processing.
}
}
【讨论】: