对于我的java webapp,如果用户尚未登录,我希望在每个(JSP)页面上显示一个登录表单。页面可以是安全的(HTTPS)也可以不是(HTTP)。
登录表单必须在安全(HTTPS)URL上POST,以防止以明文形式发送用户名/密码。
如果用户当前位于页面 http :// localhost: 8080 / app / home,则使用jstl [c:url value =“/ login”]计算登录表单URL不会将方案从HTTP更改为HTTPS (虽然/ login在我的web.xml中标记为CONFIDENTIAL)。 相反,它会提供一个类似 http :// localhost: 8080 / app / login的网址,该网址会将重定向发送到 https :// localhost: 8443 / app / login访问时。 那么为什么容器重定向而不是重写URL以便首先使用正确的方案(+端口)?
我可以对登录表单安全URL进行硬编码,但这样便于移植。
或许,对于我不了解的网络安全有一些考虑......
答案 0 :(得分:1)
当您使用“/ login”作为URL时,浏览器会将URL解释为与包含URL的页面的URL具有相同的主机名,端口和方案。如果要使用HTTPS,则服务器端必须返回使用URL(至少)“https:”方案的HTML。这在HTML规范中指定。
但是,您不一定要将主机名硬连接到JSP中。 JSP可以从配置属性中获取主机名,或者从当前请求URL中找出它。
但有没有一种标准方法可以让容器(jetty,tomcat ......)将“/ login”转换为完整的安全URL,例如localhost:8443 / app / login?
AFAIK,没有。 (顺便说一句,如果有Jetty或Tomcat这样做的具体方式,它就不会是标准......)
当我尝试访问非安全URL时,容器能够将重定向发送到正确的安全URL,那么为什么不跳过重定向部分并通过response.encodeURL()生成安全URL?
好问题。
据我了解,自动传入的安全URL请求的功能是特定于容器的,需要在容器级别进行配置。具体来说,需要告诉容器(或其他东西)需要这种处理的传入URL。在为传出消息创建URL时,JSP引擎需要类似的信息才能执行相同的操作。 AFAIK,Tomcat的JSP配置中没有这样的工具。
您需要询问JSR委员会中产生Java EE规范的人,以获得有关为什么没有标准方法可以做到这一点的答案。
即使我可以从当前请求URL中找出主机名,我仍然需要知道HTTPS端口(443?8443?)。如果此端口更改,则必须在服务器和应用程序配置中更改
确实如此,但在两个地方更改配置参数是一件小事。
就像我说的那样,如果您对各种标准组织不满意,因为没有为此提供标准解决方案......或者Tomcat / Jetty实施者没有提供非标准解决方案...您应该采取这与他们一起。
FWIW,我使用自定义的“secureURL”标签来解决这个问题,但我的用例要复杂得多。我正在实现可以放入现有站点的组件,并且当https可用或不可用时,以及使用或不使用安全cookie时需要工作......例如。