Rest call on expired session: HTTP 401 response causes browser to display login window

前端 未结 2 1456
醉梦人生
醉梦人生 2021-02-08 03:32

I have written a HTML 5 application that uses AngularJS and interfaces with a Java REST backend running on Tomcat. I use Spring Security to handle login and security.

W

相关标签:
2条回答
  • 2021-02-08 04:03

    I finally found the solution for this. As I mentioned in my update the reason is, that the response contains the WWW-Authenticate header field. My solution was then to change the configuration of spring security to return a different header:

    WWW-Authenticate: FormBased
    

    To do this I had to implement the AuthenticaitonEntryPoint interface and manually set the header and status code in the response:

    @Component( "restAuthenticationEntryPoint" )
    public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {
    
        @Override
        public void commence( HttpServletRequest request, HttpServletResponse response,
                              AuthenticationException authException ) throws IOException {
            response.setHeader("WWW-Authenticate", "FormBased");
            response.setStatus( HttpServletResponse.SC_UNAUTHORIZED );
        }
    }
    

    then I changed the configuration of spring-security and set the entry-point-ref to point to the new class:

    <http pattern="/rest/**" create-session="never" entry-point-ref="restAuthenticationEntryPoint">
        <intercept-url pattern="/rest/**" access="ROLE_USER" />
        <http-basic />
        <session-management />
    </http>
    
    0 讨论(0)
  • 2021-02-08 04:12

    If you want to avoid changing the server and make it return WWW-Authenticate header for all other callers, you can change your client to send its request with X-Requested-With header with XMLHttpRequest value. By default, Spring Security will not to send WWW-Authenticate for such requests. (see Spring source)

    0 讨论(0)
提交回复
热议问题