我如何知道 HttpServletRequest 是不是受 <security-constraint> 约束?

Posted

技术标签:

【中文标题】我如何知道 HttpServletRequest 是不是受 <security-constraint> 约束?【英文标题】:How do I know whether HttpServletRequest is subject to <security-constraint> or not?我如何知道 HttpServletRequest 是否受 <security-constraint> 约束? 【发布时间】:2011-07-23 11:29:11 【问题描述】:

我的 web.xml 中有一个带有安全约束的 servlet,如下所示:

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Admin</web-resource-name>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

以上强制切换到 https 协议并且工作正常。但是在受保护的页面上,有一些 relative 链接到不安全的页面。当用户点击它们时,它们会通过我想要避免的 https 打开。将相对链接转换为绝对链接不是一种选择。 Servlet 规范没有提供强制不安全连接的方法,所以我将实现一个过滤器,将用户重定向到 http:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException 
    if(!isSubjectToAuthConstraint(request)) 
        // Check protocol and redirect to http if https
        // ....
     else 
        // Do nothing, managed by servlet spec
        filterChain.doFilter(request, response);
    

所以我需要知道请求是否受到安全约束。我如何以编程方式知道它?有可能吗?

【问题讨论】:

【参考方案1】:

嘿,通常情况下,https 端口是 443。通过在浏览器中输入 https://www.example.com:443/welcome.html,浏览器会将其扩展为 https://www.example.com/welcome.html

也许这就是你需要的:

String serverAddress = "";    
String serverName = request.getServerName( );
String serverPort = "" + request.getServerPort( );

if( request.isSecure( ) ) 
  serverAddress = "https://" + serverName + ":" + serverPort;
 else 
  serverAddress = "http://" + serverName + ":" + serverPort;

【讨论】:

以上是关于我如何知道 HttpServletRequest 是不是受 <security-constraint> 约束?的主要内容,如果未能解决你的问题,请参考以下文章

HttpServletRequest - 如何获取引用 URL?

如何从 Java 中的 HttpServletRequest 检索原始帖子数据

如何通过 HttpServletRequest 发送数组

HttpServletRequest对象

如何在 @service 类中获取 HttpServletRequest 对象

如何在我的 spring bean 中获取 HttpServletRequest?