Tomcat JDBC Realm登录始终失败

时间:2016-11-28 17:42:50

标签: jsf 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 个答案:

答案 0 :(得分:0)

我正在使用Tomcat内置函数来完成它而我正在使用一个简单的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>
相关问题