Java 如果用户已通过身份验证,如何将请求重定向到配置的Shiro loginUrl?

Java 如果用户已通过身份验证,如何将请求重定向到配置的Shiro loginUrl?,java,authentication,login,shiro,Java,Authentication,Login,Shiro,我有一个使用Shiro进行身份验证的Web应用程序。web.xml和shiro.ini的相关部分包括: <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>ShiroFilter</filter-n

我有一个使用Shiro进行身份验证的Web应用程序。web.xml和shiro.ini的相关部分包括:

<listener>
    <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class>
</listener>

<filter>
    <filter-name>ShiroFilter</filter-name>
    <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>ShiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>ERROR</dispatcher>
</filter-mapping>
Shiro正确地拦截来自未经身份验证的客户端的所有请求,并重定向到已配置的loginUrl(然后在成功身份验证后将它们转发到请求页面)。我希望发生的是,如果经过身份验证的客户端向/authoring/login.html发出显式请求,请将其重定向到/authoring。只有当客户端经过身份验证时,才会发生这种情况


例如,想想Gmail是如何工作的——当你已经登录时尝试访问mail.google.com(甚至)会将你重定向到收件箱。Shiro开箱即用,这可能吗?如果没有,正确的实现方法是什么?

您可以自己处理登录请求或使用框架,您需要更改
shiro.ini
以使用

您现在可以检查用户是否已登录,如果为true,则可以重定向:

Subject currentUser = SecurityUtils.getSubject();
if(currentUser.isAuthenticated()){
    //redirect
}else{
    AuthenticationToken token =  new UsernamePasswordToken(username, password);
    currentUser.login(token);
    WebUtils.redirectToSavedRequest(request, response, "index.xhtml");
}

这不是一个完全现成的解决方案。我不确定您是否可以在身份验证之外获得成功的url,您可以手动重定向
WebUtils.issueRedirect(req,resp,url)

我遇到了同样的问题,并通过将登录页面转换为JSP并在开头添加重定向来解决此问题:

<%
    if (SecurityUtils.getSubject().isAuthenticated()) {
        response.sendRedirect(request.getContextPath());
    }
%>


您是否建议扩展PassThruAuthenticationFilter,然后将该代码放入重写方法中?如果是的话,我找不到合适的方法。还是说代码应该在控制器中?我们目前没有登录控制器,我正试图找出如何使用您的推荐。不,我建议您将该代码放在为您的登录页面服务的任何页面中。我使用jsf,这样代码就进入了我的登录方法中,在我的后台,你可以扩展默认的过滤器
org.apache.shiro.web.filter.authc.FormAuthenticationFilter
,如果你想做什么,你可能在6年后也可以从这里访问成功的url,感谢您将我指向
WebUtils.redirectToSavedRequest
,这正是我想要的:)
Subject currentUser = SecurityUtils.getSubject();
if(currentUser.isAuthenticated()){
    //redirect
}else{
    AuthenticationToken token =  new UsernamePasswordToken(username, password);
    currentUser.login(token);
    WebUtils.redirectToSavedRequest(request, response, "index.xhtml");
}
<%
    if (SecurityUtils.getSubject().isAuthenticated()) {
        response.sendRedirect(request.getContextPath());
    }
%>