2017-06-21 71 views
0

如何调试javax.servlet.ServletException引起的request.login()方法?
Login.java使用JDBCRealm时发生异常

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    // TODO Auto-generated method stub 
    PrintWriter out = response.getWriter(); 
    String username = request.getParameter("username"); 
    String password = request.getParameter("password"); 
    try {  
     request.login(username, password); // Exceptions happen. 
     out.println("logged in"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

tomcat的server.xml中

<!-- Use the LockOutRealm to prevent attempts to guess user passwords 
      via a brute-force attack --> 
     <Realm className="org.apache.catalina.realm.LockOutRealm"> 
     <!-- This Realm uses the UserDatabase configured in the global JNDI 
      resources under the key "UserDatabase". Any edits 
      that are performed against this UserDatabase are immediately 
      available for use by the Realm. --> 
     <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> 
     </Realm> 


<!-- added by myself> 
    <Context> 
     <Realm className="org.apache.catalina.realm.JDBCRealm" 
      connectionName="root" 
      connectionPassword="password" 
      connectionURL="jdbc:mysql://localhost/forum?autoReconnectForPools=true&amp;characterEncoding=UTF-8" 
      digest="MD5" 
      driverName="com.mysql.jdbc.Driver" 
      roleNameCol="role_name" 
      userCredCol="user_pass" 
      userNameCol="user_name" 
      userRoleTable="user_roles" 
      userTable="users" /> 
    </Context> 

例外:

javax.servlet.ServletException:登录失败在 org.apache.catalina.authenticator.AuthenticatorBase .doLogin(AuthenticatorBase.java:963) at org.apache.catalina.authenticator.AuthenticatorBase.l ogin(AuthenticatorBase.java:943) at org.apache.catalina.connector.Request.login(Request.java:2768)at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1064) at com.example.Login.doPost(Login.java:55)at javax.servlet.http.HttpServlet.service(HttpServlet.java:650)at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.tomcat。 websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 在 org.apache.catalina.core .StandardWrapperValve.invoke(StandardWrapperValve.java:218) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:110) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java :506) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportV alve.java:103) 在 org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:962) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:445) 在 org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1115) 在 org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:637) at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:318) at java.uti l.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 在 java.util.concurrent.ThreadPoolExecutor中的$ Worker.run(ThreadPoolExecutor.java:617) 在 org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread。Java的:745)

+0

登录前创建会话。代码:'if(request.getUserPrincipal()== null){ request.getSession(); //创建会话 request.login(username,password); }' –

+0

你是如何在数据库中填充密码列'user_pass'的?它应该是MD5散列的外观 –

+0

@Steve我使用插入到用户(user_name,user_pass)值('1',MD5('1'));'。只是为了测试。 – user7328234

回答

1

你得到一个Login fail因为您用于在数据库中创建哈希密码的方法是,通过Tomcat的JDBCRealm使用的不同。

您应该使用Tomcat提供的digest工具(位于Tomcat安装的bin目录中)来生成哈希密码,而不使用MySql MD5函数。

例如(以“1”密码):

[[email protected] apache-tomcat-8.0.18]$ bin/digest.sh -s 0 -a MD5 1 
1:$1$c4ca4238a0b923820dcc509a6f75849b 

我希望这个结果($1$c4ca4238a0...)是您将在数据库表中观察到的不同。

此外,根据Tomcat 8 Realm Configuration HOW-TO,您应该摘录值{username}:{realm}:{cleartext-password}而不是仅仅{cleartext-password}并将其存储在数据库中。 {realm}值来自web.xml文件中的<realm-name>

+0

是的,这是不同的。每次运行带有密码'1'的摘要命令时,值都是不同的。那么如何存储密码? – user7328234

+0

看来你需要指定'salt'的长度为'0'。 –

+0

Tomcat 8的文档有点清晰...... –