【问题标题】:Filter on j_security_check not working. Glassfish V3 Netbeans 6.8过滤 j_security_check 不起作用。 Glassfish V3 Netbeans 6.8
【发布时间】:2010-03-22 15:20:11
【问题描述】:

我正在尝试在 j_security_check 上执行过滤器以执行一些登录后操作,例如更改重定向 url 等。但问题是我的过滤器永远不会被执行。我可以申请的任何拼凑?任何帮助,将不胜感激。我真的厌倦了容器管理的安全性。

提前致谢。

【问题讨论】:

    标签: java servlets


    【解决方案1】:

    您不能以编程方式挂钩/j_security_check。这是一个安全限制。

    您最好的选择是通过手动检查HttpSession 中的用户主体来确定首次登录,如果不存在则将其放在那里,然后执行您的操作。我在here 之前发布了类似的答案。这是过滤器代码的摘录,您只需将过滤器映射到所需的url-pattern 覆盖受保护的页面。

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        UserPrincipal user = httpRequest.getUserPrincipal();
        HttpSession session = httpRequest.getSession();
        if (user != null && session.getAttribute("user") == null) {
            session.setAttribute("user", user);
    
            // First-time login. You can do your intercepting thing here.
        }
        chain.doFilter(request, response);
    }
    

    【讨论】:

    • 嗨 BalusC,实际上我想根据他/她的角色将用户重定向到正确的位置。这就是为什么我想保留一个过滤器以查看 j_security_check 在会话/请求中为 url 重定向设置的所有变量。我终于找到了答案。这是一种补丁工作,但更重要的是:)请参阅此链接,并请评论您对我的方法的看法:- stackoverflow.com/questions/2478770/…
    • 您可以在过滤器中执行此操作。将response 转换回HttpServletResponse 并致电sendRedirect()。 Scriptlet 是不好的做法。
    • 你确定!我会考虑到这一点。代替过滤器,我也可以保留一个简单的 servlet。不管怎样,重要的是现在我可以休息了。我从字面上搜索了谷歌上的每个链接,看看我是否可以在这里和那里设置一些属性,它应该开始工作。但遗憾的是我没有找到任何这样的链接。然后,我在stackoverflow上发布了,在这里我也没有得到任何回应。所以,我非常失望,然后今天我开始研究 Spring 安全性,看看它可以提供什么,但最后这个想法让我印象深刻,现在我可以休息,让容器处理一切。
    • 这种过滤逻辑不属于servlet。过滤器是它的理想场所。
    【解决方案2】:

    恕我直言,您不应该尝试拦截容器的身份验证系统;在您的情况下,可以在 web.xml 中以声明方式设置重定向 URL。

    如果您想执行一些身份验证后操作,我建议设置一个虚拟的身份验证后 servlet/jsp 来执行您想要的操作,然后重定向到请求的资源。然后可以将该认证后 servlet 正确配置为登录后页面。

    【讨论】:

    • 嗨奥利弗,据我所知,我们无法在 web.xml 中设置重定向 URL。我有不同的不同角色。例如。管理员和一般。您可以在 web.xml 中为这两个角色登录后为同一登录页面设置成功 url 吗?因此,如果 Admin 登录,他应该被重定向到 /Admin/home.jsp,而对于 General,它应该是 /General/home.jsp 等等。在我看来,这根本不可能。这就是为什么我试图在 j_security_check 上保留一个过滤器。不过,如果我遗漏了什么,请告诉我。
    【解决方案3】:

    一种便携式解决方案。

    1. 在模式 /* 上注册一个全局过滤器;

    2. 在 doFilter() 中尝试从会话中获取自定义对象(即用户工作区);

    3. 如果对象为空,则将新对象放入会话并执行登录后逻辑。

      public void doFilter(
           ServletRequest request,
           ServletResponse response,
           FilterChain chain
        ) throws IOException, ServletException
        {
           Principal principal = request.getUserPrincipal();
      
           if(principal != null) {
              UserWorkspace uwks = (UserWorkspace) getSession(request).getAttribute("com.foo.myproject.userworkspace");
      
              if (uwks == null) {
                uwks = new UserWorkspace(principal);
                getSession(request).setAttribute("com.foo.myproject.userworkspace", uwks);
      
                //
                // post-login code here
                //
      
              }
           }
      
           chain.doFilter(request, response);
        }
      

    【讨论】:

      猜你喜欢
      • 2011-04-08
      • 2019-11-21
      • 2014-05-07
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-08
      • 1970-01-01
      相关资源
      最近更新 更多