当前位置: 首页 > 知识库问答 >
问题:

当发生超时后调用Servlet方法(控制器)时,Spring Security 3.1重定向到login不起作用

孙莫希
2023-03-14

问题是类似的:Spring Security 3.1重定向到登录不起作用

我将Spring3.1与Spring Mvc和Spring Security一起使用。

这里是app-security-config。

<security:http  auto-config="true" use-expressions="true">
    <security:form-login login-page="/login.jsp" 
                    login-processing-url="/j_spring_security_check" 
                    default-target-url="/pages/index.jsp"
                    always-use-default-target="true"
                    authentication-failure-url="/login.jsp?login_error=1"/>
                    <security:access-denied-handler ref="accessDeniedHandler"/>

    <!--  Session Invalida-->
    <security:logout invalidate-session="true" logout-success-url="/login.jsp" delete-cookies="JSESSIONID" />

    <!--  Interceptadores -->
    <!-- security:intercept-url pattern="/expire.jsp*" filters="none"/-->
    <!-- security:intercept-url pattern="/login.jsp*" access="ROLE_ANONYMOUS" requires-channel="https"/-->

    <security:intercept-url pattern="/expire.jsp" access="permitAll" />
    <security:intercept-url pattern="/AccessDenied.jsp*" access="permitAll" />
    <security:intercept-url pattern="/scripts/*" access="permitAll" />
    <security:intercept-url pattern="/styles/*" access="permitAll" />
    <security:intercept-url pattern="/images/*" access="permitAll" />
    <security:intercept-url pattern="/login.jsp" access="permitAll" requires-channel="https"/>
    <security:intercept-url pattern="/pages/**" access="hasAnyRole(${role.autenticated})"  requires-channel="https"/>
    <security:http-basic/>

    <!--  Establece maximas sesiones para un usuarios -->
    <security:session-management session-fixation-protection="none" >
       <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
    </security:session-management>         

    <!--  Establece maximas sesiones para un usuarios -->
    <!-- security:session-management invalid-session-url="/expire.jsp"  session-fixation-protection="none" >
       <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/expire.jsp"/>
    </security:session-management-->    

    <!-- security:session-management invalid-session-url="/login.jsp?login_error=2" session-authentication-error-url="/login.jsp?login_error=3" session-fixation-protection="none" >
       <security:concurrency-control max-sessions="1" error-if-maximum-exceeded="true" expired-url="/login.jsp?login_error=4"/>
    </security:session-management-->   

    <security:port-mappings>
        <security:port-mapping http='8080' https="8443"/>
    </security:port-mappings>

</security:http>


<beans:bean id="accessDeniedHandler" class="ar.com.firstdata.upploader.web.mvc.controller.AccessDeniedController">
    <beans:property name="accessDeniedUrl" value="/AccessDenied.jsp"> </beans:property>
</beans:bean> 
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:META-INF/spring/*-config.xml</param-value>
</context-param>

<jsp-config>
    <taglib>
        <taglib-uri>sitemesh-page</taglib-uri>
        <taglib-location>/tld/sitemesh-page.tld</taglib-location>
    </taglib>

    <taglib>
        <taglib-uri>sitemesh-decorator</taglib-uri>
        <taglib-location>/tld/sitemesh-decorator.tld</taglib-location>
    </taglib>

    <taglib>
        <taglib-uri>/spring</taglib-uri>
        <taglib-location>/META-INF/spring.tld</taglib-location>
    </taglib>
</jsp-config>

<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>

<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
    <dispatcher>REQUEST</dispatcher>
    <dispatcher>FORWARD</dispatcher>
</filter-mapping>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

<!-- SiteMesh -->
<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>*.html</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>*.htm</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>

<listener>
    <listener-class>
        org.springframework.security.web.session.HttpSessionEventPublisher
    </listener-class>
</listener>

<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-class>
        org.springframework.web.servlet.DispatcherServlet
    </servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<session-config>
    <session-timeout>1</session-timeout>
</session-config>

<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>*.app</url-pattern>
</servlet-mapping>

<welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
</welcome-file-list>
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
    <property name="mappings">
        <props>
            <prop key="/pages/findConfData.app">configurationController</prop>
            <prop key="/pages/readLoadXML.app">configurationController</prop>
            <prop key="/pages/addElementToList.app">configurationController</prop>
            <prop key="/pages/eraseElementToList.app">configurationController</prop>
            <prop key="/pages/persistXMLfiletransfer.app">configurationController</prop>
            <prop key="/pages/findLoggedUser.app">configurationController</prop>
        </props>            
    </property>
</bean>
<session-config>
    <session-timeout>1</session-timeout>
</session-config>
<prop key="/pages/eraseElementToList.app">configurationController</prop>

@RequestMapping(method = RequestMethod.POST)
public final ModelAndView eraseElementToList(HttpServletRequest request,    
HttpServletResponse response) throws Exception {

我在日志中得到一个ActionDenied异常,就这样...没有将我重定向到登录页面。

共有1个答案

马魁
2023-03-14

这里最有可能的解释是,您有一个SpringExceptionHandler,它会捕获AccessDeniedException并阻止Spring Security性对其起作用。如果您在某个地方使用安全注释,这是一个相当常见的问题(尽管您在问题中没有提到这一点)。

另外,从stacktrace中应该可以清楚地看到,它提到了Spring Security没有处理它的异常(始终发布stacktrace)。另外,请更仔细地重新检查日志,以区分这两种情况。如果您看到“重定向到身份验证入口点”,那么这意味着Spring Security正在接收异常,您应该看到登录页面。如果使用异常处理程序,您将不会看到这一点。

如果这是问题所在,您可以使@exceptionhandler注释更加具体,这样它们就不会捕获此异常,或者您可以创建一个特定的@exceptionhandler(AccessDeniedException.class)注释并简单地在其中重新抛出异常。

 类似资料:
  • 问题内容: 我一直在寻找有关该主题的许多文章,但找不到适合我的解决方案。 我正在将Java EE 6与JSF 2.0结合使用(在JBoss AS 7.1上部署) 在我的我有: 并且我 希望在会话自动超时时将用户重定向到登录页面。 我尝试过的 方法1:使用过滤器 我尝试了以下过滤器: 在我尝试过的 和 过滤器在每次请求时都会被调用(在控制台中记录“被调用的适配器”)。 但是,会话超时时不会调用它。

  • 默认情况下,它类似于NestJS或node。js express调用具有超时的控制器。 结果是控制器每2分钟被一次又一次地调用,如何禁用该功能? 所需的结果应该是超时的。 我看到了延长超时长度的建议,我希望保留超时,但响应异常。

  • 我目前正在为Minecraft Fabric编程一个插件/服务器端模块,它可以改变玩家的死亡。更准确地说:当玩家死亡时,他们应该在某些情况下保留他们的库存。 为了实现这一点,我有一个扩展net的类。我的世界。实体游戏者PlayerEntity和“混入”课堂。我的世界。服务器网络服务器播放属性。现在,如果我调用此方法,我将onDeath(DamageSource source)中的方法调用重定向到我

  • 嗨,我正在使用这段代码为我的CQ5示例应用程序创建一个Post方法。 它可以处理GET请求。但是对于POST(doPost)请求,我重新引用了一条消息:。我应该做些什么来解决这个问题?

  • 我有一个项目,我已经将Vaadin与Spring Boot集成在一起。我使用的依赖项之一是spring-boot-starter-security。 当我调用url http://localhost:8080/appxyz/时,它会将我重定向到http://localhost:8080/appxyz/login。我希望它会带着@springui(“/login”)注释转到我的LoginUI类中。它

  • 我是一个使用ASP.NET MVC5的新手。我需要对控制器进行Jquery调用,以返回一个传递单个参数的新视图。我可以看到很多类似MVC3和之前版本的例子,但却很难找到任何处理MVC4或MVC5并起作用的例子。我所要做的就是从输入元素获取一个值,将其传递给控制器ActionResult,然后打开一个新视图。 PageTwo是视图,Home是控制器。 我试过的代码(包括许多其他代码)通常在404: