2014-02-18 81 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>