2014-02-18 74 views
0

我有一個使用servlet的登錄項目。servlet過濾器登錄無法正常工作

我的Java類:

LoginServlet:

package two; 

import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.RequestDispatcher; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

/** 
* Servlet implementation class LoginServlet 
*/ 
@WebServlet("/LoginServlet") 
public class LoginServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 
private final String userID = "admin"; 
private final String password = "password"; 

protected void doPost(HttpServletRequest request, 
     HttpServletResponse response) throws ServletException, IOException { 

    // get request parameters for userID and password 
    String user = request.getParameter("user"); 
    String pwd = request.getParameter("pwd"); 

    if (userID.equals(user) && password.equals(pwd)) { 
     HttpSession session = request.getSession(); 
     session.setAttribute("user", "Pankaj"); 
     // setting session to expiry in 30 mins 
     session.setMaxInactiveInterval(30 * 60); 
     Cookie userName = new Cookie("user", user); 
     userName.setMaxAge(30 * 60); 
     response.addCookie(userName); 
     response.sendRedirect("loginSuccess.jsp"); 
    } else { 
     RequestDispatcher rd = getServletContext().getRequestDispatcher(
       "/login.html"); 
     PrintWriter out = response.getWriter(); 
     out.println("<font color=red>Either user name or password is wrong.</font>"); 
     rd.include(request, response); 
    } 

} 

} 

LogoutServlet:

package two; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

/** 
* Servlet implementation class LogoutServlet 
*/ 
@WebServlet("/LogoutServlet") 
public class LogoutServlet extends HttpServlet { 
private static final long serialVersionUID = 1L; 

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    response.setContentType("text/html"); 
    Cookie[] cookies = request.getCookies(); 
    if(cookies != null){ 
    for(Cookie cookie : cookies){ 
     if(cookie.getName().equals("JSESSIONID")){ 
      System.out.println("JSESSIONID="+cookie.getValue()); 
      break; 
     } 
    } 
    } 
    //invalidate the session if exists 
    HttpSession session = request.getSession(false); 
    System.out.println("User="+session.getAttribute("user")); 
    if(session != null){ 
     session.invalidate(); 
    } 
    response.sendRedirect("login.html"); 
} 

} 

AuthenticationFilter:

package two; 

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

@WebFilter("/AuthenticationFilter") 
public class AuthenticationFilter implements Filter { 

private ServletContext context; 

public void init(FilterConfig fConfig) throws ServletException { 
    this.context = fConfig.getServletContext(); 
    this.context.log("AuthenticationFilter initialized"); 
} 

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 

    HttpServletRequest req = (HttpServletRequest) request; 
    HttpServletResponse res = (HttpServletResponse) response; 

    String uri = req.getRequestURI(); 
    this.context.log("Requested Resource::" + uri); 

    HttpSession session = req.getSession(false); 

    if (session == null 
      && !(uri.endsWith("html") || uri.endsWith("LoginServlet"))) { 
     this.context.log("Unauthorized access request"); 
     res.sendRedirect("login.html"); 
    } else { 
     // pass the request along the filter chain 
     chain.doFilter(request, response); 
    } 

} 

public void destroy() { 
    // close any resources here 
} 

} 

RequestLoggingFilter:

package two; 

import java.io.IOException; 
import java.util.Enumeration; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.annotation.WebFilter; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 

/** 
* Servlet Filter implementation class RequestLoggingFilter 
*/ 
@WebFilter("/RequestLoggingFilter") 
public class RequestLoggingFilter implements Filter { 

private ServletContext context; 

public void init(FilterConfig fConfig) throws ServletException { 
    this.context = fConfig.getServletContext(); 
    this.context.log("RequestLoggingFilter initialized"); 
} 

public void doFilter(ServletRequest request, ServletResponse response, 
     FilterChain chain) throws IOException, ServletException { 
    HttpServletRequest req = (HttpServletRequest) request; 
    Enumeration<String> params = req.getParameterNames(); 
    while (params.hasMoreElements()) { 
     String name = params.nextElement(); 
     String value = request.getParameter(name); 
     this.context.log(req.getRemoteAddr() + "::Request Params::{" + name 
       + "=" + value + "}"); 
    } 

    Cookie[] cookies = req.getCookies(); 
    if (cookies != null) { 
     for (Cookie cookie : cookies) { 
      this.context.log(req.getRemoteAddr() + "::Cookie::{" 
        + cookie.getName() + "," + cookie.getValue() + "}"); 
     } 
    } 
    // pass the request along the filter chain 
    chain.doFilter(request, response); 
} 

public void destroy() { 
    // we can close resources here 
} 

} 

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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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>ServletPractice</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>/faces/*</url-pattern> 
</servlet-mapping> 
<context-param> 
<param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name> 
<param-value>resources.application</param-value> 
</context-param> 
<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> 
<description> 
This parameter tells MyFaces if javascript code should be allowed in 
the rendered HTML output. 
If javascript is allowed, command_link anchors will have javascript code 
that submits the corresponding form. 
If javascript is not allowed, the state saving info and nested parameters 
will be added as url parameters. 
Default is 'true'</description> 
<param-name>org.apache.myfaces.ALLOW_JAVASCRIPT</param-name> 
<param-value>true</param-value> 
</context-param> 
<context-param> 
<description> 
If true, rendered HTML code will be formatted, so that it is 'human-readable' 
i.e. additional line separators and whitespace will be written, that do not 
influence the HTML code. 
Default is 'true'</description> 
<param-name>org.apache.myfaces.PRETTY_HTML</param-name> 
<param-value>true</param-value> 
</context-param> 
<context-param> 
<param-name>org.apache.myfaces.DETECT_JAVASCRIPT</param-name> 
<param-value>false</param-value> 
</context-param> 
<context-param> 
<description> 
If true, a javascript function will be rendered that is able to restore the 
former vertical scroll on every request. Convenient feature if you have pages 
with long lists and you do not want the browser page to always jump to the top 
if you trigger a link or button action that stays on the same page. 
Default is 'false' 
</description> 
<param-name>org.apache.myfaces.AUTO_SCROLL</param-name> 
<param-value>true</param-value> 
</context-param> 
<listener> 
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class> 
</listener> 

<filter> 
<filter-name>RequestLoggingFilter</filter-name> 
<filter-class>two.RequestLoggingFilter</filter-class> 
</filter> 
<filter> 
<filter-name>AuthenticationFilter</filter-name> 
<filter-class>two.AuthenticationFilter</filter-class> 
</filter> 

<filter-mapping> 
<filter-name>RequestLoggingFilter</filter-name> 
<url-pattern>/*</url-pattern> 
<dispatcher>REQUEST</dispatcher> 
</filter-mapping> 
<filter-mapping> 
<filter-name>AuthenticationFilter</filter-name> 
<url-pattern>/*</url-pattern> 
</filter-mapping> 

<servlet> 
<servlet-name>LoginServlet</servlet-name> 
<servlet-class>two/LoginServlet</servlet-class> 
</servlet> 

<servlet-mapping> 
<servlet-name>LoginServlet</servlet-name> 
<url-pattern>/two/LoginServlet</url-pattern> 
</servlet-mapping> 

</web-app> 

的login.html:

<!DOCTYPE html> 
<html> 
<head> 
<meta charset="US-ASCII"> 
<title>Login Page</title> 
</head> 
<body> 

<form action="LoginServlet" method="post"> 

Username: <input type="text" name="user"> 
<br> 
Password: <input type="password" name="pwd"> 
<br> 
<input type="submit" value="Login"> 
</form> 
</body> 
</html> 

loginSuccess.jsp:

<%@ page language="java" contentType="text/html; charset=US-ASCII" 
pageEncoding="US-ASCII"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> 
<title>Login Success Page</title> 
</head> 
<body> 
<% 
    //allow access only if session exists 
    String user = (String) session.getAttribute("user"); 
    String userName = null; 
    String sessionID = null; 
    Cookie[] cookies = request.getCookies(); 
    if (cookies != null) { 
     for (Cookie cookie : cookies) { 
      if (cookie.getName().equals("user")) 
       userName = cookie.getValue(); 
      if (cookie.getName().equals("JSESSIONID")) 
       sessionID = cookie.getValue(); 
     } 
    } 
%> 
<h3> 
    Hi 
    <%=userName%>, Login successful. Your Session ID=<%=sessionID%></h3> 
<br> User=<%=user%> 
<br> 
<a href="CheckoutPage.jsp">Checkout Page</a> 
<form action="LogoutServlet" method="post"> 
    <input type="submit" value="Logout"> 
</form> 
</body> 
</html> 

RequestLoggingFilter:

<%@ page language="java" contentType="text/html; charset=US-ASCII" 
pageEncoding="US-ASCII"%> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> 
<title>Login Success Page</title> 
</head> 
<body> 
<% 
    //allow access only if session exists 
    String user = (String) session.getAttribute("user"); 
    String userName = null; 
    String sessionID = null; 
    Cookie[] cookies = request.getCookies(); 
    if (cookies != null) { 
     for (Cookie cookie : cookies) { 
      if (cookie.getName().equals("user")) 
       userName = cookie.getValue(); 
      if (cookie.getName().equals("JSESSIONID")) 
       sessionID = cookie.getValue(); 
     } 
    } 
%> 
<h3> 
    Hi 
    <%=userName%>, Login successful. Your Session ID=<%=sessionID%></h3> 
<br> User=<%=user%> 
<br> 
<a href="CheckoutPage.jsp">Checkout Page</a> 
<form action="LogoutServlet" method="post"> 
    <input type="submit" value="Logout"> 
</form> 
</body> 
</html> 

當我在登錄頁面提交時,它給404錯誤: 請求的資源(/ ServletPractice/two/LoginServlet)不可用。

和我的瀏覽器地址欄更改爲:本地主機:9090/ServletPractice /二/ LoginServlet

請幫助我。 thankes

回答

0

此初始問題看起來像是HTML登錄表單。我假設,根據您收到的地址欄,您正在使用localhost:9090/ServletPractice/two/login.html作爲登錄頁面。

表格<form action="LoginServlet" method="post">...</form>將在與包含表單的HTML頁面相同的級別上發佈到「LoginServlet」,但假設您已將登錄servlet映射到「/ LoginServlet」而不是「/ two/LoginServlet」,則不是在該地點找到。

所以我會嘗試改變的形式是:

<form action="/ServletPractice/LoginServlet" method="post">...</form> 

也許

<form action="/LoginServlet" method="post">...</form>