2016-11-28 65 views
0

我有一個登錄爲例,其一個頁面,你去管理員或操作員登錄...的Tomcat JDBC領域登錄總是失敗

無論這一點,即使有正確的憑據,最後變成了一個servlet異常:登錄失敗...

這就是,希望你能幫助我:

錯誤日誌:

javax.servlet.ServletException: Login failed 
at org.apache.catalina.authenticator.AuthenticatorBase.doLogin(AuthenticatorBase.java:1083) 
at org.apache.catalina.authenticator.AuthenticatorBase.login(AuthenticatorBase.java:1060) 
at org.apache.catalina.connector.Request.login(Request.java:2692) 
at org.apache.catalina.connector.RequestFacade.login(RequestFacade.java:1073) 
at br.edu.unisep.bean.LoginBean.entrar(LoginBean.java:23) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:498) 
at org.apache.el.parser.AstValue.invoke(AstValue.java:247) 
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:267) 
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105) 
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:87) 
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102) 
at javax.faces.component.UICommand.broadcast(UICommand.java:315) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282) 
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:650) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:230) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:192) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:165) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:108) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:620) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:349) 
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:784) 
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) 
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:802) 
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1410) 
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
at java.lang.Thread.run(Thread.java:745) 

LoginBean.java

package br.edu.unisep.bean; 

import javax.faces.bean.ManagedBean; 
import javax.faces.bean.RequestScoped; 
import javax.faces.context.FacesContext; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServletRequest; 

@ManagedBean 
@RequestScoped 
public class LoginBean { 

private String login; 

private String senha; 

public String entrar(){ 

    FacesContext context = FacesContext.getCurrentInstance(); 
    HttpServletRequest request = (HttpServletRequest) context.getExternalContext().getRequest(); 

    try { 
     request.login(login, senha); 

     //VEREFICA SE O USUARIO LOGADO E POSSUI O PAPEL ADM 
     if (request.isUserInRole("ADMIN")){ 
      return "admin/indexAdmin.jsf?faces-redirect=true"; 
     } else { 
      return "sistema/indexSistema.jsf?faces-redirect=true"; 
     } 

    } catch (ServletException e) { 
     e.printStackTrace(); 
     return "login.jsf"; 
    } 
} 

public String getLogin() { 
    return login; 
} 

public void setLogin(String login) { 
    this.login = login; 
} 

public String getSenha() { 
    return senha; 
} 

public void setSenha(String senha) { 
    this.senha = senha; 
} 

}

的web.xml

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> 
<display-name>exemploAcesso</display-name> 
<servlet> 
    <servlet-name>Faces Servlet</servlet-name> 
    <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Faces Servlet</servlet-name> 
    <url-pattern>*.jsf</url-pattern> 
</servlet-mapping> 
<context-param> 
    <description>State saving method: 'client' or 'server' (=default). See JSF Specification 2.5.2</description> 
    <param-name>javax.faces.STATE_SAVING_METHOD</param-name> 
    <param-value>client</param-value> 
</context-param> 
<context-param> 
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
    <param-value>resources.application</param-value> 
</context-param> 
<listener> 
    <listener-class>com.sun.faces.config.ConfigureListener</listener-class> 
</listener> 

<login-config> 
    <auth-method>FORM</auth-method> 
    <form-login-config> 
     <form-login-page> 
      /login.jsf 
     </form-login-page> 
     <form-error-page> 
      /erroLogin.jsf 
     </form-error-page> 
    </form-login-config> 
</login-config> 

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Admin</web-resource-name> 
     <url-pattern>/admin/*</url-pattern> 
     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>ADMIN</role-name> 
    </auth-constraint> 
</security-constraint> 

<security-constraint> 
    <web-resource-collection> 
     <web-resource-name>Operador</web-resource-name> 
     <url-pattern>/sistema/*</url-pattern> 
     <http-method>GET</http-method> 
     <http-method>POST</http-method> 
    </web-resource-collection> 
    <auth-constraint> 
     <role-name>OPERADOR</role-name> 
    </auth-constraint> 
</security-constraint> 

<error-page> 
    <error-code>403</error-code> 
    <location>/proibido.jsf</location> 
</error-page> 

    <welcome-file-list> 
     <welcome-file>index.jsf</welcome-file> 
    </welcome-file-list> 
</web-app> 

的context.xml

<?xml version="1.0" encoding="UTF-8"?> 

<Context antiJARLocking="true" path="exemploAcesso"> 
    <Realm className="org.apache.catalina.realm.JDBCRealm" 
     debug="4" 
     driverName="org.postgresql.Driver" 
     connectionURL="jdbc:postgresql://localhost:5434/controle_acesso" 
     connectionName="postgres" 
     connectionPassword="r4p4dur4" 
     userTable="usuarios" 
     userNameCol="id_usuario" 
     userCredCol="ds_senha" 
     userRoleTable="papeis_usuario" 
     roleNameCol="id_papel" 
     digest="MD5" 
    /> 
</Context> 

login.xhtml

<!DOCTYPE html> 

    <html xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 
    xmlns:h="http://xmlns.jcp.org/jsf/html" 
    xmlns:f="http://xmlns.jcp.org/jsf/core"> 

    <head> 
    <meta charset="utf-8" /> 
    <title>Exemplo Acesso</title> 
    </head> 

    <body> 

    <h:form> 
     Login: 
     <h:inputText value="#{loginBean.login}"/> <br /> 

     Senha: 
     <h:inputSecret value="#{loginBean.senha}"/> <br /> 

     <h:commandButton value="Entrar" action="#{loginBean.entrar}"/> 
    </h:form> 

    </body> 
</html> 
+1

你們都檢查/調試了什麼?用戶名/密碼是否到達bean?那麼這不是一個JSF問題。如果他們不是它是一個純粹的JSF問題,而不是tomcat/jdbc問題 – Kukeltje

+0

我在MAC和Windows環境中嘗試了相同的設置,它的工作,所以,它可能是關於我的環境變量或東西...東真的不知道...... – Dezainer

回答

0

我使用的是內置的功能到Tomcat做一個d我正在使用一個簡單的jsp, 將表單的結果發佈到'j_security_check'。因此,用於用戶名的字段名是'j_username',密碼是'j_password'(我使用的是Tomcat 8)。

<form action="j_security_check" method="POST"> 
    <table> 
     <tr> 
     <td><label for="username">Login:</label></td> 
     <td><input id="username" type="text" name="j_username" value=""></td> 
    </tr> 
    <tr> 
    <td><label for="password">Senha:</label></td> 
    <td><input id="password" type="password" name="j_password"></td> 
    <td><input type="submit" value="Login"/></td> 
    </tr> 
    </table> 
</form> 
+0

謝謝你的回答,但是,我正在攻讀大學考試,我真的需要這樣做。我在另一個環境中嘗試了相同的配置(即時使用LINUX並在MAC和WINDOWS上嘗試過),並且工作得很完美。所以我不知道發生了什麼...... – Dezainer