过滤j_security_check不起作用。 Glassfish V3 Netbeans 6.8

时间:2010-03-22 15:20:12

标签: java servlets

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

提前致谢。

3 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

一种便携式解决方案。

  1. 在pattern / *;

  2. 上注册全局过滤器
  3. 在doFilter()中尝试从会话中获取自定义对象(即用户工作区);

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

    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);
      }