2017-08-06 101 views
1

我試圖使用loginServlet從jsp頁面登錄。它重定向到servlet,但它不會進行身份驗證並引發錯誤。下面是代碼:java.lang.ClassNotFoundException:javax.ws.rs.client.RxInvokerProvider

JSP文件:

<div class="container"> 
     <div class="row"> 
      <div class="box"> 
       <div class="col-md-6 col-md-offset-4"> 

        <h2 class="intro-text">Welcome! Login here:</h2> 


        <form class="form-horizontal" action="LoginServlet" method="POST"> 
         <div class="form-group"> 
          <label class="control-label col-sm-2" for="username">Username:</label> 
          <div class="col-sm-4"> 
           <input type="text" class="form-control" id="username" placeholder="Enter username" name="un"> 
          </div> 
         </div> 
         <div class="form-group"> 
          <label class="control-label col-sm-2" for="pwd">Password:</label> 
          <div class="col-sm-4"> 
           <input type="password" class="form-control" id="pwd" placeholder="Enter password" name="pwd"> 
          </div> 
         </div> 

         <div class="form-group"> 
          <div class="col-sm-offset-2 col-sm-4"> 
           <div class="checkbox"> 
            <label><input type="checkbox" name="remember"> Remember me</label> 
           </div> 
          </div> 
         </div> 
         <div class="form-group"> 
          <div class="col-sm-offset-2 col-sm-4"> 
           <button type="submit" class="btn btn-success">Submit</button> 
          </div> 
         </div> 
        </form> 
       </div> 

      </div> 
     </div> 
    </div> 

LoginServlet:從UserDAO的

@WebServlet("/LoginServlet") 
public class LoginServlet extends HttpServlet { 


public void doPost(HttpServletRequest request, HttpServletResponse response) 
         throws ServletException, java.io.IOException { 


try 
{  

    User user = new User(); 
    user.setUsername(request.getParameter("un")); 
    user.setPassword(request.getParameter("pwd")); 

    PrintWriter writer = response.getWriter(); 

    // build HTML code 
    String htmlRespone = "<html>"; 
    htmlRespone += "<h2>Your username is: " + user.getUsername() + "<br/>";  
    htmlRespone += "Your password is: " + user.getPassword() + "</h2>";  
    htmlRespone += "</html>"; 

    writer.println(htmlRespone); 

    if (authUser(user)) 
    { 
      System.out.println("exists!"); 
      HttpSession session = request.getSession(true);  
      session.setAttribute("currentSessionUser",user); 
      response.sendRedirect("home.jsp"); //logged-in page   
    } 

    else { 
     System.out.println("not!"); 
      response.sendRedirect("invalidLogin.jsp"); //error page 
    } 

} 


catch (Throwable theException)  
{ 
    System.out.println(theException); 
} 
     } 

    public boolean authUser(User user) { 
     // TODO Auto-generated method stub 
     User userDB = UserDAO.getUserByUsername(user.getUsername()); 
     System.out.println(userDB.getUsername()+" "+userDB.getPassword()); 
     System.out.println(user.getUsername()+" "+user.getPassword()); 

     if (userDB != null && userDB.getUsername().equals(user.getUsername()) && userDB.getPassword().equals(user.getPassword())) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

} 

getUserByUsername方法:

public static User getUserByUsername(String username) { 

     Session session = factory.openSession(); 
     Transaction tx = null; 
     List<User> users = null; 

      tx = session.beginTransaction(); 
      Query query = session.createQuery("FROM User WHERE username = :username "); 
      query.setParameter("username", username); 
      List<User> result = query.list(); 

      tx.commit(); 

     return result != null && !result.isEmpty() ? result.get(0) : null; 

    } 

POM文件:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 

    <modelVersion>4.0.0</modelVersion> 

    <groupId>org.paul.licenta</groupId> 
    <artifactId>teachApp</artifactId> 
    <packaging>war</packaging> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>teachApp</name> 

    <build> 
     <finalName>teachApp</finalName> 
     <plugins> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>2.5.1</version> 
       <inherited>true</inherited> 
       <configuration> 
        <source>1.7</source> 
        <target>1.7</target> 
       </configuration> 
      </plugin> 
     </plugins> 
    </build> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.glassfish.jersey</groupId> 
       <artifactId>jersey-bom</artifactId> 
       <version>${jersey.version}</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 
     <dependency> 
      <groupId>org.glassfish.jersey.containers</groupId> 
      <artifactId>jersey-container-servlet-core</artifactId> 
      <!-- use the following artifactId if you don't need servlet 2.x compatibility --> 
      <!-- artifactId>jersey-container-servlet</artifactId --> 
     </dependency> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-commons-annotations</artifactId> 
      <version>3.0.0.ga</version> 
     </dependency> 

     <dependency> 
       <groupId>org.hibernate</groupId> 
       <artifactId>hibernate-annotations</artifactId> 
       <version>3.3.0.GA</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.ws.rs</groupId> 
      <artifactId>javax.ws.rs-api</artifactId> 
      <version>2.0-m08</version> 
     </dependency> 
     <dependency> 
      <groupId>javax.transaction</groupId> 
      <artifactId>jta</artifactId> 
      <version>1.1</version> 
     </dependency> 
      <dependency> 
     <groupId>javax.servlet</groupId> 
     <artifactId>javax.servlet-api</artifactId> 
     <version>3.0.1</version> 
    </dependency> 
     <dependency> 
     <groupId>commons-codec</groupId> 
     <artifactId>commons-codec</artifactId> 
     <version>1.10</version> 
    </dependency> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
     <version>1.1.1</version> 
    </dependency> 

     <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.10.Final</version> 
    </dependency> 

     <dependency> 
      <groupId>com.google.guava</groupId> 
      <artifactId>guava</artifactId> 
      <version>22.0</version> 
     </dependency> 


    <!-- for JPA, use hibernate-entitymanager instead of hibernate-core --> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.3.10.Final</version> 
    </dependency> 
     <dependency> 
     <groupId>mysql</groupId> 
     <artifactId>mysql-connector-java</artifactId> 
     <version>5.1.34</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-search-orm</artifactId> 
     <version>5.3.0.Final</version> 
    </dependency> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>3.8.1</version> 
     <scope>test</scope> 
    </dependency> 
     <dependency> 
     <groupId>javax.ws.rs</groupId> 
     <artifactId>javax.ws.rs-api</artifactId> 
     <version>2.0</version> 
    </dependency> 
     <!-- uncomment this to get JSON support 
     <dependency> 
      <groupId>org.glassfish.jersey.media</groupId> 
      <artifactId>jersey-media-moxy</artifactId> 
     </dependency> 
     --> 
    </dependencies> 
    <properties> 
     <jersey.version>2.26-b03</jersey.version> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    </properties> 
</project> 

這裏是我得到的錯誤:

SEVERE: StandardWrapper.Throwable 
java.lang.NoClassDefFoundError: javax/ws/rs/client/RxInvokerProvider 
    at org.glassfish.jersey.internal.inject.Providers.getJaxRsProviderInterfaces(Providers.java:114) 
    at org.glassfish.jersey.internal.inject.Providers.<clinit>(Providers.java:87) 
    at org.glassfish.jersey.model.internal.ComponentBag.modelFor(ComponentBag.java:435) 
    at org.glassfish.jersey.model.internal.ComponentBag.lambda$registerModel$5(ComponentBag.java:394) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.model.internal.ComponentBag.registerModel(ComponentBag.java:386) 
    at org.glassfish.jersey.model.internal.ComponentBag.register(ComponentBag.java:297) 
    at org.glassfish.jersey.model.internal.CommonConfig.register(CommonConfig.java:459) 
    at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:447) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:332) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:178) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:370) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1269) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1182) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1072) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5368) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5660) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: javax.ws.rs.client.RxInvokerProvider 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735) 
    ... 27 more 

Aug 06, 2017 11:27:45 AM org.apache.catalina.core.StandardContext loadOnStartup 
SEVERE: Servlet [Jersey Web Application] in web application [/teachApp] threw load() exception 
java.lang.ClassNotFoundException: javax.ws.rs.client.RxInvokerProvider 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1892) 
    at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1735) 
    at org.glassfish.jersey.internal.inject.Providers.getJaxRsProviderInterfaces(Providers.java:114) 
    at org.glassfish.jersey.internal.inject.Providers.<clinit>(Providers.java:87) 
    at org.glassfish.jersey.model.internal.ComponentBag.modelFor(ComponentBag.java:435) 
    at org.glassfish.jersey.model.internal.ComponentBag.lambda$registerModel$5(ComponentBag.java:394) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.model.internal.ComponentBag.registerModel(ComponentBag.java:386) 
    at org.glassfish.jersey.model.internal.ComponentBag.register(ComponentBag.java:297) 
    at org.glassfish.jersey.model.internal.CommonConfig.register(CommonConfig.java:459) 
    at org.glassfish.jersey.server.ResourceConfig.register(ResourceConfig.java:447) 
    at org.glassfish.jersey.servlet.WebComponent.<init>(WebComponent.java:332) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:178) 
    at org.glassfish.jersey.servlet.ServletContainer.init(ServletContainer.java:370) 
    at javax.servlet.GenericServlet.init(GenericServlet.java:158) 
    at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1269) 
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1182) 
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:1072) 
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:5368) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5660) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1571) 
    at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1561) 
    at java.util.concurrent.FutureTask.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 

Aug 06, 2017 11:27:45 AM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["http-bio-8080"] 
Aug 06, 2017 11:27:45 AM org.apache.coyote.AbstractProtocol start 
INFO: Starting ProtocolHandler ["ajp-bio-8009"] 
Aug 06, 2017 11:27:45 AM org.apache.catalina.startup.Catalina start 
INFO: Server startup in 9144 ms 
java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/Session; 

我嘗試添加在互聯網上提出的其他罐和一些其他的事情,我在這裏找到,但沒有到目前爲止的工作。我希望它在認證後將我重定向到指定的頁面。有任何想法嗎?

非常感謝!

回答

0

java.lang.ClassNotFoundException: javax.ws.rs.client.RxInvokerProvider異常發生在初始化期間,而不是登錄期間。請求只能在日誌中最後一行之後處理:INFO: Starting ProtocolHandler ["http-bio-8080"]

爲了解決這個異常的根本原因,在調試器中運行tomcat,在ClassNotFoundException上設置異常斷點並檢查Servlet的實際類型(堆棧跟蹤中有GenericServlet.init())。這將是您需要修復的servlet。很可能通過將所需的代碼(或任何傳遞依賴項)添加到類路徑中。

除此之外,這段代碼是錯了相當多的層面:

  • 你輸出寫入到響應您重定向之前:一旦文本已被髮送到瀏覽器,你不會可以重新定向,因爲這需要編寫HTTPS標頭。當他們已經被髮送時,你運氣不好,會產生更多的例外。
  • 你沒有在任何異常中恢復你的事務(例如,commit/rollback應該在finally塊中) - 但至少你不傾向於SQL注入。
  • 您正在將明文密碼存儲在數據庫中
  • 當您長期解決此問題時您正在實施自己的登錄,例如,通過容器(閱讀servlet規範)
+0

感謝您的回覆!我解決了錯誤的代碼情況,但仍然無法找到最後一個要點,即servlet規範中的容器。所以我不知道我是否應該專注於解決我的servlet問題或學習容器並將它們用於身份驗證 –

+0

如果我從主類運行相同的方法authUser(User),它的工作完美。爲什麼從一個servlet中導致問題?如果我沒有向servlet發出任何請求,但只是比較一些硬編碼的用戶和密碼,它也可以工作。我對servlet真的很陌生,我真的很困惑這種情況 –

+0

authUser不會導致問題,至少在你發佈的stacktrace中有一個堅果。確保所有必需的依賴項(jar文件)都部署在WEB-INF/lib中以擺脫CnF擴展。並且接受在進行身份驗證之前發生的異常(至少是您在問題中發佈的異常)。您的身份驗證問題要麼是獨立的,要麼是後續問題 - 我無法確定,因爲我沒有看到身份驗證失敗。 –