Spring安全性和特殊字符

时间:2013-04-30 14:14:10

标签: spring security urlencode

我需要使用用户名和/或密码中的特殊字符通过url登录j_spring_security_check

http://localhost:8080/appname/j_spring_security_check?j_username=username&j_password=üüü

无效,

http://localhost:8080/appname/j_spring_security_check?j_username=username&j_password=%c3%bc%c3%bc%c3%bc

(用“üüü”urlencoded) 无法正常工作

有什么建议吗?如果您需要查看任何其他配置,请告诉我。

由于

3 个答案:

答案 0 :(得分:5)

Java Servlet标准在支持Unicode方面很差。 ISO-8859-1的默认值是无用的,并且仍然没有跨容器兼容的方法将其配置为其他东西。

matteosilv的答案中的过滤方法适用于请求主体。对于URL中的参数,您必须使用特定于容器的选项。例如,在Tomcat中,在URIEncoding中的<Connector>上设置server.xml;在Glassfish <parameter-encoding> glassfish-web.xmlgetParameter()。{/ p>

(如果你必须以完全跨容器兼容的方式工作,你最终必须编写自己的CharacterEncodingFilter实现,这确实很可悲。糟糕的Servlet。)

但无论如何,在GET URL参数中传递登录表单字段是个坏主意。

这首先是因为登录会导致状态发生变化,所以它不是“幂等”的。这使得GET成为一种不合适的方法,并导致一些实际问题,例如在您导航页面时可能会将您登录,或者由于缓存而无法登录,等等。

其次,网址可以“泄露”的方式有多种,包括引荐来源跟踪,日志记录,代理和浏览器历史记录保留。因此,您不应将任何敏感数据(如密码)放入URL中,包括在GET表单中提交。

我建议使用POST表单提交,以及{{1}}。

答案 1 :(得分:0)

也许web.xml文件中的encodingFilter可能会有所帮助:

<filter>
<filter-name>encodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
        <param-name>forceEncoding</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

来源:Spring security: Form login special characters

答案 2 :(得分:0)

通过将CharacterEncodingFilter移动到web.xml中的SpringSecurityFilterChain,实际上解决了这个问题。