2

我需要通过 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)也不起作用

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

谢谢

4

3 回答 3

5

Java Servlet 标准在支持 Unicode 方面非常糟糕。ISO-8859-1 的默认值是无用的,并且仍然没有跨容器兼容的方式将其配置为其他内容。

的答案中的过滤器方法matteosilv适用于请求正文。对于 URL 中的参数,您必须使用特定于容器的选项。比如在Tomcat中,设置URIEncoding<Connector>server.xml;在Glassfish<parameter-encoding>glassfish-web.xml。_

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

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

这首先是因为登录会导致状态更改发生,因此它不是“幂等的”。这使得 GET 成为一种不合适的方法,并导致大量实际问题,例如当您浏览页面时可能会登录,或者由于缓存而无法登录等等。

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

我建议使用 POST 表单提交,连同CharacterEncodingFilter.

于 2013-05-01T08:44:14.317 回答
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:表单登录特殊字符

于 2013-04-30T14:23:34.267 回答
0

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

于 2015-10-22T07:25:59.270 回答