Tomcat本地JSF应用含特殊字符的密码无法登录及调试问题
解决Tomcat JSF应用j_security登录特殊字符密码问题及调试方法
一、特殊字符密码无法登录的解决方案
1. 显式设置登录表单字符集
在登录表单的<form>标签中指定字符集,确保表单提交时按UTF-8编码传递参数:
<form method="post" action="j_security_check" accept-charset="UTF-8"> <!-- 表单元素:j_username、j_password及提交按钮 --> </form>
2. 调整字符编码过滤器配置
将SetCharacterEncodingFilter放在所有过滤器最前端,同时开启forceEncoding,强制请求编码为UTF-8:
<!-- web.xml中配置 --> <filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.apache.catalina.filters.SetCharacterEncodingFilter</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>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> </filter-mapping>
3. 完善Tomcat Connector配置
在server.xml的Connector节点中同时添加URIEncoding和useBodyEncodingForURI参数,确保POST请求体编码与URI编码一致:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
4. 确保tomcat-users.xml编码正确
- 将
tomcat-users.xml保存为UTF-8无BOM格式 - 在Tomcat启动参数中添加
-Dfile.encoding=UTF-8,强制JVM以UTF-8读取配置文件,避免特殊字符解析乱码
二、查看发送密码的调试方法
1. 浏览器开发者工具直接查看
打开浏览器开发者工具(如Chrome DevTools),切换到Network标签:
- 提交登录请求后,找到
j_security_check请求条目 - 查看请求详情中的Form Data,即可看到发送的
j_password值
2. 配置Tomcat访问日志记录
在server.xml的Host节点中添加AccessLogValve,临时记录POST参数(测试完成后请移除,避免密码泄露):
<Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" prefix="localhost_access_log" suffix=".txt" pattern="%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %{j_password}p"/>
重启Tomcat后,登录请求的密码会被记录到localhost_access_log*.txt日志文件中。
3. 自定义过滤器打印密码
编写简单过滤器拦截登录请求,直接打印或通过日志框架记录密码:
public class PasswordLoggingFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException {} @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; if (httpRequest.getRequestURI().endsWith("j_security_check")) { String password = httpRequest.getParameter("j_password"); // 控制台打印,也可替换为Log4j等日志框架记录 System.out.println("提交的密码:" + password); } chain.doFilter(request, response); } @Override public void destroy() {} }
在web.xml中配置该过滤器(需放在字符编码过滤器之后):
<filter> <filter-name>PasswordLoggingFilter</filter-name> <filter-class>com.yourpackage.PasswordLoggingFilter</filter-class> </filter> <filter-mapping> <filter-name>PasswordLoggingFilter</filter-name> <url-pattern>/j_security_check</url-pattern> </filter-mapping>
内容的提问来源于stack exchange,提问作者Touniouk
相关产品推荐
相关产品推荐

