我需要使用用户名和/或密码中的特殊字符通过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) 无法正常工作
有什么建议吗?如果您需要查看任何其他配置,请告诉我。
由于
答案 0 :(得分:5)
Java Servlet标准在支持Unicode方面很差。 ISO-8859-1的默认值是无用的,并且仍然没有跨容器兼容的方法将其配置为其他东西。
matteosilv
的答案中的过滤方法适用于请求主体。对于URL中的参数,您必须使用特定于容器的选项。例如,在Tomcat中,在URIEncoding
中的<Connector>
上设置server.xml
;在Glassfish <parameter-encoding>
glassfish-web.xml
中getParameter()
。{/ 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>
答案 2 :(得分:0)
通过将CharacterEncodingFilter移动到web.xml中的SpringSecurityFilterChain,实际上解决了这个问题。