As to #1, that's just how
servlet form authentication works. The main entry point should not be the login page, but the main -protected- page behind it. Trying to access that page will make a detour through the login page if necessary. I don't think it's ideal, either, but then, the Servlet API-provided security mechanism suffices only for simple scenarios anyway IMO. So for all "serious" web apps I've gone with hand-rolled user and login management instead of the built-in stuff.
As to #2, I've never tried getUserPrincipal, so I can't speculate on why it's not working. The reason is that I never saw the need to get a Principal object - getting the username and its associated roles was always sufficient. Those are provided by the getRemoteUser and isUserInRole methods.