Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/390.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
Java Spring MVC奇怪的行为_Java_Spring_Model View Controller - Fatal编程技术网

Java Spring MVC奇怪的行为

Java Spring MVC奇怪的行为,java,spring,model-view-controller,Java,Spring,Model View Controller,我有一个处理URI为“/home”的请求的方法。此请求是在成功登录过程后生成的。下面是一个小代码来支持我的情况: <security:form-login login-processing-url="/static/j_spring_security_check" login-page="/login" authentication-failure-url="/login?login_error=t" default-target-url="/home"/> 此位很重要,因为pe

我有一个处理URI为“/home”的请求的方法。此请求是在成功登录过程后生成的。下面是一个小代码来支持我的情况:

<security:form-login login-processing-url="/static/j_spring_security_check"
login-page="/login" authentication-failure-url="/login?login_error=t"
default-target-url="/home"/> 
此位很重要,因为person p被用作其他请求的数据源

现在问题来了。我不知道这是否是Google Chrome的属性,但出于某种原因,浏览器会记住您在登录前所做的请求,而不是在成功登录后通过/home request,它会绕过此/home gate生成上一个请求,导致空指针异常,因为从未设置person p,由于会话未由/home请求填充

我知道,对于其他请求,我应该进行验证,但我不喜欢让用户在不经过/home之前生成任何请求的想法

完成了文本描述,现在解释我如何在步骤中获得不想要的行为:

  • 询问您知道存在的请求,例如: myApp/nameOfSomething/viewThisSomething-您将按预期进入登录页面(您必须通过身份验证才能接受请求)

  • 输入正确的凭据,而不是转到默认的目标url=“/home” 您正在自动发出上一个请求myApp/nameOfSomething/viewThisSomething,而不使用必要的数据填充会话并导致nullpointer异常

  • 另外有趣的是,logger显示邮件,所以它们可能是同时执行的,但是/home请求速度较慢——会发生这种情况吗

    我在另一种方法中解决了这个问题,方法是检查是否为null,并强制返回到正常工作的/home,但我是控制狂,不喜欢用户做他不想做的事情


    谢谢您的时间,

    这不是一个bug,而是一个特性。登录后让用户去他想去的地方比强迫用户去主页要友好得多。他可以将其中一个受保护的页面加入书签,或者只是浏览一些包含指向受保护页面链接的非受保护页面

    发件人:

    如果尝试访问受保护的表单时未提示表单登录 资源,则默认的目标url选项开始发挥作用。这是 成功登录后用户将被带到的URL,以及 默认为“/”。您还可以进行配置,以便用户始终 在该页面结束(无论登录是否为“按需登录” 或者他们通过设置 始终将默认目标属性设置为“true”

    依我看,你应该保持原样,但是确保登录成功后设置了所需的sesion属性,而不是在主页中设置此属性。这将确保每个受保护的页面都可以访问会话属性,即使用户没有进入主页


    通过使用自定义UsernamePasswordAuthenticationFilter子类,您可以轻松地完成此操作,一旦身份验证成功,该子类将在会话中设置适当的属性。

    哦,我在自定义方面做得太差了,但无论如何,谢谢,我会仔细研究的。
    String userMail = SecurityContextHolder.getContext().
        getAuthentication().getName();
    logger.info(userMail);
    
    Person p = userService.retrieveUserByEmail(userMail);
    session.setAttribute("person", p);
    
    return "user/home";