如何使用jsp测试request.getHeader中的值?

时间:2011-07-22 15:10:24

标签: jsp jstl el user-agent

我设置一个变量:

<% String userAgent = request.getHeader("user-agent");%>

如何使用

针对userAgent测试不同的方案
<c:choose></c:choose>

我不确定如何设置它?

1 个答案:

答案 0 :(得分:7)

您不希望将 scriptlet 与taglibs / EL混合使用。它们不在同一范围内运行。

隐式映射对象${header}在EL中提供所有请求标头。由于user-agent标题名称包含特殊字符-,因此${header.user-agent}无法按预期工作,因此您需要使用引号括号[]

${header['user-agent']}

所以,这应该做:

<c:choose>
    <c:when test="${fn:contains(header['user-agent'], 'Gecko')}">
        You're pretending to use a Gecko based browser.
    </c:when>
    <c:when test="${fn:contains(header['user-agent'], 'MSIE')}">
        You're pretending to use a MSIE based browser.
    </c:when>
    <c:when test="${fn:contains(header['user-agent'], 'Webkit')}">
        You're pretending to use a Webkit based browser.
    </c:when>
    <c:otherwise>
        It's not clear which browser you're pretending to use.
    </c:otherwise>
</c:choose>

无关问题:以这种方式检查用户代理标头是一种代码味道。用户代理标头完全由客户端控制,很容易被欺骗成完全不同的值(这就是我在上面的代码示例中使用术语“假装”的原因)。如何正确解决实际功能需求,您需要详细说明实际功能需求。

例如,在JavaScript中,您应该更喜欢feature detection而不是浏览器检测。

或者当您想根据媒体类型加载特定样式表时,您应该使用media attribute。 E.g。

<link rel="stylesheet" href="screen.css" media="screen,projection,tv" />
<link rel="stylesheet" href="smartphone.css" media="only screen and (max-device-width:480px)"/>
<link rel="stylesheet" href="handheld.css" media="handheld" />
<link rel="stylesheet" href="print.css" media="print" />

或者,当您希望向最终用户提供用户代理标头中的信息的用户友好摘要时,您希望使用单独的服务,例如http://user-agent-string.info/。他们还提供Java API example