Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring JSF2&x2B;春季3&x2B;Shiro-会话超时不';t重定向到登录页面_Spring_Jsf 2_Shiro - Fatal编程技术网

Spring JSF2&x2B;春季3&x2B;Shiro-会话超时不';t重定向到登录页面

Spring JSF2&x2B;春季3&x2B;Shiro-会话超时不';t重定向到登录页面,spring,jsf-2,shiro,Spring,Jsf 2,Shiro,我有一个JSF2.0/Spring应用程序,它将ApacheShiro添加到会话超时中,当用户单击命令按钮或触发AJAX请求时,会话超时后不会发生重定向。当他们刷新浏览器时,它确实起作用。这在所有浏览器中都会发生。以下是我的applicationContext.xml: <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name

我有一个JSF2.0/Spring应用程序,它将ApacheShiro添加到会话超时中,当用户单击命令按钮或触发AJAX请求时,会话超时后不会发生重定向。当他们刷新浏览器时,它确实起作用。这在所有浏览器中都会发生。以下是我的applicationContext.xml:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager" />
        <property name="loginUrl" value="/index.faces"/>
        <property name="filterChainDefinitions">
                <value>
                        /* = authc 
                </value>
        </property>
</bean>
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <property name="realm" ref="opacsRealm" />
</bean>

<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

<bean id="sha512Matcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">

        <property name="hashAlgorithmName" value="SHA-256" />
        <property name="hashIterations" value="1024" />
</bean>



<bean id="opacsRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
        <property name="dataSource" ref="dataSource" />
        <property name="authenticationQuery" 
                value="select PASSWORD, SALT from SEC_USERS where NAME = ?" />
        <property name="userRolesQuery" 
                value="SELECT ROLE_NAME FROM SEC_USERS_ROLES WHERE USER_NAME = ?" />
        <property name="permissionsQuery" 
                value="SELECT permission FROM SEC_ROLES_PERMISSIONS WHERE ROLE_NAME = ?" />
        <property name="permissionsLookupEnabled" value="true" />
        <property name="saltStyle" value="COLUMN" />
        <property name="credentialsMatcher" ref="sha512Matcher"/>
</bean>

/*=authc
我在设置中是否做错了什么?web.xml如下所示:

<filter>
    <filter-name>shiroFilter</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
    <init-param>
        <param-name>targetFilterLifecycle</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>shiroFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
<session-config>
  <!-- web.xml expects the session timeout in minutes: -->
  <session-timeout>1</session-timeout>
</session-config>

雪洛菲特
org.springframework.web.filter.DelegatingFilterProxy
targetFilterLifecycle
真的
雪洛菲特
/*
1.

刚刚回复了您的邮件。现在的情况是,浏览器在Ajax调用中无缝地处理重定向,因此Shiro会重定向到登录页面,Ajax请求的最终结果是登录页面的HTML内容,而这并不是您真正想要的

如何解决这个问题的要点是在Ajax Api URL中添加一个(自定义)Shiro过滤器,用于检查主题是否经过身份验证,而不是重定向到登录,并返回一个Ajax请求理解的响应,以指示用户未登录。然后,客户端处理此响应可以重定向到登录页面(或者可能是同一页面,因为Shiro随后将重定向到登录,但可以配置为记住您试图去的地方,从而在成功登录后将用户带回正确的页面)

我的过滤器实现返回Http代码401以及“WWW Authentication”头和自定义的“challenge scheme”(如果您执行了基本身份验证质询,那么浏览器将弹出其基本身份验证对话框-已经有一个Shiro过滤器执行此操作)


在您的Ajax调用中,您需要检测此响应,目前我有一个笨拙的错误回调来检测此响应,但我认为应该可以修改JavaScript库(JQuery,无论什么)来无缝处理此响应。

只是为了好玩,我将authc更改为使用自定义FormAuthenticationFilter,并重写redirectToLogin方法,并将代码添加回父类中。没有更改,但我添加到方法中的日志语句已打印出来,因此正在进行重定向,但除非完成屏幕刷新,否则浏览器不会重定向。我没有答案,但我可以告诉您,这可能按设计工作。使用这种配置,当会话超时时,authc过滤器将把任何ajax请求重定向到登录页面。但是,为了将页面刷新到登录页面,javascript需要解释302响应并刷新页面。这已经在Shiro用户列表上讨论过了,我相信询问者找到了一个合适的解决方案:我刚刚读到了,谢谢。他还没有回复他的解决方案,所以我会看看是否能从他的帖子中找到答案。这部分确实有效,我让ajax组件重定向到登录页面。与此相关的最后一个问题是页面刷新。我可以使用onunload捕捉页面刷新,但如果在会话超时后发生,页面将消失。我在页面中放置了警报,以便在发生某些事件(如DOM刷新)时弹出,但在会话超时后刷新页面时不会弹出任何消息。有没有办法抓住这个?下面是我尝试过的一些代码片段:试图格式化代码,但我忘记了如何格式化:jQuery(document).ready(function(){var request=jQuery.ajax({url:“viewJobActivity.faces”,键入:“POST”});request.done(function(msg){alert('done');});request.fail(function(jqXHR,textStatus){alert(请求失败:“+textStatus”);};});我尝试的另一种方法:
jQuery.ajax({//Define ajax properties.method:“get”,url:“viewJobActivity.faces”,//定义成功方法。成功:function(){alert(“success!”;},//定义错误方法。错误:function(objaxRequest,strError){alert(“Error!Type:+strError);});
对于使用Apache Shiro和Primefaces处理会话超时的用户:名为sessionTimeout的jquery插件。该插件的作用是等待预设的时间量,然后显示一个对话框,警告用户其会话即将超时。然后用户可以继续注销或停留在页面上,从而重置计时器。如果用户不做任何操作,那么页面最终会重定向(由您设置的时间)到登录页面。我的注销页面只会调用托管bean调用Shiro注销方法,然后返回“window.location.replace('login.faces'))“。我知道该插件并没有真正处理会话超时,但它确实为过时会话提供了一个优雅的解决方案,如果操作正确,可以执行Shiro注销,从而终止会话并取消用户身份验证。