0

我需要在 login.jsp 调用的登录 servlet 之前和之后实现一些逻辑。

所以我为 url /login 编写了一个过滤器来做到这一点。我需要获取一些操作的用户配置文件,所以我创建了这个 LoginFilter 类:

public class LoginFilter implements Filter {
    private static Logger logger = Logger.getLogger(LoginFilter.class);

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String username = httpRequest.getParameter("username");
        String password = httpRequest.getParameter("password");

        chain.doFilter(request, response);

        PortalRequestContext context = PortalRequestContext.getCurrentInstance();

        if (context == null)
            logger.info("PortalRequestContext is NULL");
        else {
            String userId = context.getRemoteUser();

            if (userId == null || userId.equals(""))
                logger.info("Login failed, IP:" + httpRequest.getRemoteAddr());
            else
                logger.info("Login executed, username:" + userId);
        }
    }

问题是“上下文”(PortalRequestContext)始终为空。我做错了什么?这是正确的方法吗?

4

5 回答 5

1

您可以开发一个 Valve 并将其添加到“门户”webapp (Tomcat/conf/Catalina/localhost/portal.xml) 的上下文文件中。这就是在 GateIN 中为 SSO 扩展所做的,例如:参见ServletAccessValve

ServletAccess.setRequestAndResponse(request, response);

然后,使用以下命令在SSOLoginModule中访问请求:

// Tomcat way (Assumed that ServletAccessValve has been configured in context.xml)
  else
  {
     request = ServletAccess.getRequest();
  }

对于 JBoss,它更简单,你只需要使用

javax.security.jacc.PolicyContext.getContext(HttpServletRequest.class.getName())
于 2013-12-20T08:47:26.080 回答
1

如果您使用的是 GateIn,您可以尝试使用

org.exoplatform.portal.webui.util.Util.getPortalRequestContext().getRequest()

ce

于 2012-06-28T08:17:48.027 回答
0

您可以添加一个 GateIN 过滤器,如这里详述。

您可以在此过滤器中静态使用 ConversationState 来获取当前用户名:

ConversationState.getCurrent().getIdentity().getUserId();

于 2013-10-31T13:38:26.333 回答
0

在登录时,PortalRequestContext尚未创建,但您可以通过调用获取远程用户HttpServletRequest#getRemoteUser()

于 2013-01-28T02:19:39.903 回答
0

只需使用对话状态对象:

// Gets the current user id
ConversationState conversationState = ConversationState.getCurrent();

org.exoplatform.services.security.Identity identity = conversationState.getIdentity();
String userId = identity.getUserId();
于 2014-03-05T08:52:01.380 回答