【问题标题】:Shiro Filter without redirect无重定向的 Shiro 过滤器
【发布时间】:2015-08-01 09:24:17
【问题描述】:

我有一个 REST 接口,它通过 jquery-Ajax-Requests 从前端代码调用。调用的 url 使用以下 shiro.ini 保护:

/api/** = authc

如果用户未通过身份验证,Shiro 想要重定向到 login-Url,而 ajax-Request 无法处理。我更喜欢 HTML 状态代码作为答案。 实现这一目标的最佳方法是什么?感谢您的任何回答!

【问题讨论】:

    标签: java ajax shiro


    【解决方案1】:

    回答问题:

    如何配置我的应用程序上下文,告诉他使用这个自定义 shiro 过滤器?

    应用程序上下文将从 shiro.ini 文件中获取更改。在其 [main] 部分定义自定义过滤器,并在适用的 URL 模式的 [urls] 部分中使用它。

    [main]
    myLocalhostFilter = my.package.LocalhostFilter
    
    ...
    
    [urls]
    ...
    /api/** = myLocalhostFilter
    

    【讨论】:

      【解决方案2】:

      您需要实现自定义 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.
                  }
              }
      

      【讨论】:

      • 谢谢,我通过扩展 FormAuthenticationFilter 让它工作了。你让我走上了正轨。
      • 如何配置我的应用程序上下文,告诉他使用这个自定义 shiro 过滤器?
      猜你喜欢
      • 2020-02-08
      • 2015-11-17
      • 2019-01-06
      • 2014-06-17
      • 2022-12-11
      • 2014-10-05
      • 2013-07-22
      • 2017-12-04
      • 2019-01-04
      相关资源
      最近更新 更多