0

Для очень простого MVC с JSP и сервлетом, какова функциональность фильтра?Использование фильтра с сервлетом контроллера

В приведенном ниже примере есть сервлет-контроллер, а затем каждый JSP представляет, я полагаю, другое представление. Сервлет взаимодействует в основном с моделью, файлом свойств со списком пользователей. Однако, login.jsp будет мутировать токен, который является сессионным компонентом.

Я понимаю, что в целом в игру приходят весна, или матчи, или какие-то другие рамки - я просто чувствую свой путь.

Правильное использование фильтров для сервлета для использования фильтра? Я не уверен, как фильтр будет входить в игру здесь, за исключением того, что «логика», из которой JSP для отправки может быть извлечена из сервлета контроллера и существует сама по себе в фильтре ...?

JSP не нуждается в доступе к фильтру, так как всякая диспетчеризация выполняется через сервлет (?).

сервлет:

package net.bounceme.dur.servlets; 

import filter.PropertiesReader; 
import java.io.IOException; 
import java.util.Collections; 
import java.util.Enumeration; 
import java.util.Map; 
import java.util.Properties; 
import java.util.logging.Logger; 
import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

@WebServlet("/controller") 
public class Controller extends HttpServlet { 

    private static final Logger log = Logger.getLogger(Controller.class.getName()); 

    protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     log.info("controller processing request.."); 
     String jsp = dispatcherLogic(request.getSession()); 
     request.getRequestDispatcher("/WEB-INF/" + jsp).forward(request, response); 
    } 

    private String dispatcherLogic(HttpSession session) { 
     Properties properties = PropertiesReader.getProps(); 
     MyToken token = (MyToken) session.getAttribute("token"); 
     if (token != null) { 
      token.setAuthenticated(properties.containsValue(token.getName())); 
     } else { 
      token = new MyToken(); 
     } 
     log.info(token.toString()); 
     session.setAttribute("token", token); 
     if (token.isAuthenticated()) { 
      return "success.jsp"; 
     } else { 
      if (token.isAttemptedLogin()) { 
       return "fail.jsp"; 
      } else { 
       return "login.jsp"; 
      } 
     } 
    } 

    private String dispatcherLogic0(HttpSession session) { 
     Map<String, String> p = PropertiesReader.getPropsAsMap(); 
     Enumeration<String> names = session.getAttributeNames(); 
     for (String s : Collections.list(names)) { 
      log.info(s); 
     } 
     MyToken t = (MyToken) session.getAttribute("token"); 
     for (String s : p.keySet()) { 
      // t.getName() = p.containsValue(s); 
     } 
     return "hello.jsp"; //always to hello page for now 
    } 

    @Override 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    @Override 
    protected void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
     processRequest(request, response); 
    } 

    @Override 
    public String getServletInfo() { 
     return "controller"; 
    } 
} 

фильтр:

package net.bounceme.dur.filter; 

import filter.PropertiesReader; 
import java.io.IOException; 
import java.io.PrintStream; 
import java.io.PrintWriter; 
import java.io.StringWriter; 
import java.util.Properties; 
import java.util.logging.Logger; 
import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 

public class AuthenticateFilter implements Filter { 

    private static final Logger log = Logger.getLogger(AuthenticateFilter.class.getName()); 
    private FilterConfig filterConfig = null; 

    public AuthenticateFilter() { 
    } 

    private void doBeforeProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException { 
     log.info("do before processing.."); 
    } 

    private void doAfterProcessing(ServletRequest request, ServletResponse response) throws IOException, ServletException { 
     log.info("do after processing"); 
    } 

    @Override 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     log.info("do filter"); 
    } 

    public FilterConfig getFilterConfig() { 
     return (this.filterConfig); 
    } 

    public void setFilterConfig(FilterConfig filterConfig) { 
     this.filterConfig = filterConfig; 
    } 

    @Override 
    public void destroy() { 
    } 

    private void props() { 
     log.info("properties file:"); 
     Properties properties = PropertiesReader.getProps(); 
     StringBuilder sb = new StringBuilder(); 
     for (String key : properties.stringPropertyNames()) { 
      String value = properties.getProperty(key); 
      sb.append("\n" + key + " => " + value); 
     } 
     log.info(sb.toString()); 
    } 

    @Override 
    public void init(FilterConfig filterConfig) { 
     log.info("init"); 

     this.filterConfig = filterConfig; 
     if (filterConfig != null) { 
      log.info("SessionCheckFilter:Initializing filter"); 
     } else { 
      log.warning("null filterConfig"); 
     } 

     props(); 

    } 

    @Override 
    public String toString() { 
     if (filterConfig == null) { 
      return ("SessionCheckFilter()"); 
     } 
     StringBuilder sb = new StringBuilder("SessionCheckFilter("); 
     sb.append(filterConfig); 
     sb.append(")"); 
     return (sb.toString()); 
    } 

    private void sendProcessingError(Throwable t, ServletResponse response) { 
     log.info("send processing error"); 
     String stackTrace = getStackTrace(t); 

     if (stackTrace != null && !stackTrace.equals("")) { 
      try { 
       response.setContentType("text/html"); 
       try (PrintStream ps = new PrintStream(response.getOutputStream()); PrintWriter pw = new PrintWriter(ps)) { 
        pw.print("<html>\n<head>\n<title>Error</title>\n</head>\n<body>\n"); //NOI18N 
        pw.print("<h1>The resource did not process correctly</h1>\n<pre>\n"); 
        pw.print(stackTrace); 
        pw.print("</pre></body>\n</html>"); //NOI18N 
       } 
       response.getOutputStream().close(); 
      } catch (Exception ex) { 
      } 
     } else { 
      try { 
       try (PrintStream ps = new PrintStream(response.getOutputStream())) { 
        t.printStackTrace(ps); 
       } 
       response.getOutputStream().close(); 
      } catch (Exception ex) { 
      } 
     } 
    } 

    public static String getStackTrace(Throwable t) { 
     String stackTrace = null; 
     try { 
      StringWriter sw = new StringWriter(); 
      PrintWriter pw = new PrintWriter(sw); 
      t.printStackTrace(pw); 
      pw.close(); 
      sw.close(); 
      stackTrace = sw.getBuffer().toString(); 
     } catch (Exception ex) { 
     } 
     log.warning(stackTrace); 
     return stackTrace; 
    } 

} 

Войти лексема:

package net.bounceme.dur.servlets; 

import java.util.logging.Logger; 

public class MyToken {//should probably be immutable... 

    private static Logger log = Logger.getLogger(MyToken.class.getName()); 

    private String name = "nemo"; 
    private String role = "captain"; 
    private String password = "abc"; 
    private boolean authenticated = false; 
    private boolean attemptedLogin = false; 

    public MyToken() { 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getRole() { 
     return role; 
    } 

    public void setRole(String role) { 
     this.role = role; 
    } 

    public String getPassword() { 
     return password; 
    } 

    public void setPassword(String password) { 
     this.password = password; 
    } 

    public boolean isAuthenticated() { 
     return authenticated; 
    } 

    public void setAuthenticated(boolean authenticated) { 
     this.authenticated = authenticated; 
    } 

    public boolean isAttemptedLogin() { 
     return attemptedLogin; 
    } 

    public void setAttemptedLogin(boolean attemptedLogin) { 
     this.attemptedLogin = attemptedLogin; 
    } 

    @Override 
    public String toString() { 
     return name + authenticated + attemptedLogin; 
    } 
} 

ответ

2

сервлет не взаимодействует с фильтром. Фактически, он даже не знает, использовался ли фильтр (за исключением побочных эффектов). Кстати, ваш AuthenticateFilter.doFilter плох. Если вы установите такой фильтр в веб-приложении, он заблокирует все, поскольку он никогда не переходит к фильтру!

Логика фильтров, как следовать

servlet container prepares ServletRequest and ServletResponses objects and pass them to a *filter chain* 
    first filter optional pre-processing pass down to next in chain 
     second filter pre-processing 
     ... 
      Servlet processing 
     ... 
     second filter post-processing 
    first filter optional post processing 
servlet container pass (end of) data to client 

Метод doFilter является classicaly:

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
    // optional pre-processing 
    // optionaly return immediately to by-pass other filters and servlet processing 
    chain.doFilter(request, response); // pass down to next filter or to servlet 
             // if last filter in chain 
    // optional post-processing 
} 
Смежные вопросы