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

如何在spring security中传递参数和注销成功url?

富勇军
2023-03-14

我在spring boot应用程序中使用基于java的Spring Security配置。当用户单击注销链接时,用户将被重定向到登录页面。在这里,在这种情况下,我需要在注销成功url中传递一个自定义参数。

例如,当我注销时,应用程序被重定向到http://localhost:8080/app/login但我希望它有一个如下所示的参数http://localhost:8080/app/login?idletimeout=true

我已经为此创建了自定义LogoutSuccesshandle。我在处理程序中获取param值,然后构造成功url,然后重定向到它。但在注销时,该参数丢失。

下面是我的处理程序代码。

public class LogoutSuccessHandlerImpl extends SimpleUrlLogoutSuccessHandler {

    private final RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();

    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {

        request.getSession().invalidate();
        SecurityContextHolder.clearContext();

        request.setAttribute("isLoggedOut", "true");

        String contextPath = request.getContextPath();
        String redirectURL = "/login";

        String isIdleTimeOut = request.getParameter("idleTimeout");
        request.setAttribute("idleTimeout", isIdleTimeOut);

        System.out.println(isIdleTimeOut + " isIdleTimeOut ");

        if (isIdleTimeOut != null && isIdleTimeOut.equalsIgnoreCase("true")) {
            System.out.println("in if ");
            redirectURL += "?idleTimeout=" + isIdleTimeOut;
        }

        // setDefaultTargetUrl(redirectURL);
        // response.sendRedirect(redirectURL);
       // super.onLogoutSuccess(request, response, authentication);
        redirectStrategy.sendRedirect(request, response, redirectURL);
    }

下面是我的java配置代码。

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf()
        .and()
            .formLogin()
            .loginPage("/login")
            .loginProcessingUrl("/checkLogin")
            .defaultSuccessUrl("/home")
            .failureUrl("/login?login_error=1")
            .usernameParameter("username")
            .passwordParameter("password")
            .permitAll()
        .and()
            .logout()
            .logoutUrl("/logout")
            .logoutSuccessHandler(new LogoutSuccessHandlerImpl())
            .deleteCookies("JSESSIONID")
            .invalidateHttpSession(true)
            .permitAll()
        .and()
            .authorizeRequests()
            .antMatchers("/login**").permitAll()
            .antMatchers("/error**").permitAll()
            .antMatchers("/checkLogin**").permitAll()
            .anyRequest()
            .authenticated()
            .accessDecisionManager(accessDecisionManager)
        .and()
            .exceptionHandling()
            .accessDeniedPage("/accessDenied")
        .and()
            .headers()
            .frameOptions()
            .disable()
        .and()
            .sessionManagement()
            .invalidSessionUrl("/login")
            .maximumSessions(1);
    }

共有2个答案

赵永逸
2023-03-14

应该是这样的

http
      .logout()
          .logoutRequestMatcher(new AntPathRequestMatcher("/login?idletimeout=true"));

在xml中

<logout invalidate-session="true" logout-success-url="/login?idletimeout=true"/>
缪远
2023-03-14

您可以为您的申请准备自己的注销方法(自定义注销url):

1)准备您的LogoutController:

@Controller
@RequestMapping(value = "/logout")
public class LogoutController {

    @RequestMapping(value = {"", "/"})
    public String logout(HttpServletRequest request) {
        SecurityContextHolder.clearContext();
        HttpSession session = request.getSession(false);
        if (session != null) {
            session.invalidate();
        }
        return "redirect:" + <your-logout-success-url>;
    }

}

在这里,使会话无效并清除上下文为您提供了一种注销机制。

2) 更新jsp文件中的注销URL:

<a href="/logout" id="logout_" title="Log out"><span>Log out</span></a>

3) 此外,对于默认的“注销”场景,您仍然可以继续使用Spring Security注销:

<logout logout-success-url="/" invalidate-session="true" delete-cookies="JSESSIONID"
            logout-url="/j_spring_security_logout"/>

因此,在这种注销方法中,当用户要求注销过程时,可以对请求对象执行任何操作。现在不需要传递参数。

 类似资料:
  • 我的登录页面http://localhost:8080/nradmin/welcome,主页(登录成功后)http://localhost:8080/nradmin/home 我想注销,不再能够访问任何其他页面,如主页,但只能访问欢迎(登录)页面。如果我键入http://localhost:8080/nradmin/home在注销后的浏览器上,我可以继续访问主页,而无需登录。 我已经实现了从抽象类

  • 我正在学习springsecurity(基于java的配置),我无法使注销正常工作。当我点击注销时,我看到URL更改为http://localhost:8080/logout并获取“HTTP 404-/logout”。登录功能工作正常(即使使用自定义登录表单),但问题是注销,我怀疑重定向的url“localhost:8080/logout”应该类似于“localhost:8808/springte

  • 我使用默认的Spring Security来处理注销/登录。我有一个处理的Controller方法。 当我注销时,我看到Spring Security将我重定向到。这个Spring创建的参数的存在(有时也)允许我将我的登录处理程序编写为: 现在的问题是,当我注销时,我需要传递一个自定义参数 /logout转移到 /login.目标是我需要在中接收一个参数,我可以检查就像系统创建的和一样。 假设这个

  • 问题内容: 我试图弄清楚如何在URL中传递多个参数。我想将纬度和经度从我的android类传递给Java servlet。我怎样才能做到这一点? 在这种情况下,输出(写入文件)为。这是可行的,但我想在两个单独的参数中传递纬度和经度,以便减少在服务器端的工作。如果不可能,我如何至少在&之间添加一个空格,以便可以使用class获取经度和纬度。我试过以下行,但无济于事。 我的servlet代码如下: 我

  • 问题内容: 我已经按照此链接中所述的教程进行操作。在下面的代码中,由于某种原因,数据不会作为参数附加到url上,但是如果我使用它直接将其设置为url 则可以。 问题答案: 对于简单的情况,我建议您使用jQuery 的或语法: 如果您需要捕获失败案例,请执行以下操作: 此外,如果您始终发送JSON字符串,则可以在最后使用$ .getJSON 或$ .post以及另一个参数。

  • 问题内容: Docker 1.9允许将参数传递给dockerfile。参见链接:https : //docs.docker.com/engine/reference/builder/#arg 如何在docker-compose.yml中传递相同的参数? 如果可能,也请提供示例。 问题答案: 此功能已在Compose 1.6中添加。 参考:https : //docs.docker.com/comp