如何使用EL正确解码JSP中的cookie值?

如何使用EL正确解码JSP中的cookie值?,jsp,curl,el,tomcat8,Jsp,Curl,El,Tomcat8,我想在JSP页面上显示cookie的值。使用EL,我制作了以下内容: <c:set var="errorFlash" value="${cookie['error']}"/> <c:if test="${null != errorFlash}"> <p>${fn:escapeXml(errorFlash.value)}</p> </c:if> ${fn:escapeXml(errorFlash.value)} 这似乎可行,

我想在JSP页面上显示cookie的值。使用EL,我制作了以下内容:

<c:set var="errorFlash" value="${cookie['error']}"/>
<c:if test="${null != errorFlash}">
    <p>${fn:escapeXml(errorFlash.value)}</p>
</c:if>

${fn:escapeXml(errorFlash.value)}

这似乎可行,但我不确定这是否能正确解码cookie值中的特殊URL字符。我用curl做了一个快速测试,如下所示:

$ curl http://localhost:8080/login -v -b 'error=Hello%20World'
[...]
> Cookie: error=Hello%20World
[...]
<p>Hello%20World</p>
[...]
$curlhttp://localhost:8080/login -v-b'错误=Hello%20World'
[...]
>Cookie:error=Hello%20World
[...]
您好%20World

[...]
因此,它似乎无法正确解码%20个字符的序列。然而,这可能是curl的问题,而不是我的Tomcat实例的问题。下面是另一个例子:

$ curl http://localhost:8080/login -v -b 'error=Hello World'
[...]
> Cookie: error=Hello World
[...]
<p>Hello</p>
[...]
$curlhttp://localhost:8080/login -v-b'错误=你好世界'
[...]
>Cookie:error=Hello World
[...]
你好

[...]
我做错了什么?

逃跑。它不与任何关联。另见

如果您使用的是EL3.0(Tomcat8支持),那么您可以使用导入,并将其导入EL范围。您可以利用它来导入包含所需方法的类

将其放在JSP顶部的某个位置:

${pageContext.ELContext.importHandler.importClass('java.net.URLDecoder')}
然后,您可以按如下方式解码cookie:

<c:if test="${not empty cookie.error}">
    <p>${URLDecoder.decode(cookie.error.value, 'UTF-8')}</p>
</c:if>
另见:

有一个自定义的标签库来解码数据,或者(坏方法)有一个简单的scriplet来解码值。
@WebListener
public class Config implements ServletContextListener {

    @Override
    public void contextInitialized(ServletContextEvent event) {
        JspFactory.getDefaultFactory().getJspApplicationContext(event.getServletContext()).addELContextListener(new ELContextListener() {
            @Override
            public void contextCreated(ELContextEvent event) {
                event.getELContext().getImportHandler().importClass("java.net.URLDecoder");
            }
        });
    }

    // ...
}