Фильтр сервлета: ссылка на сокет должна быть указана в doFilter () - PullRequest
0 голосов
/ 27 марта 2009

Прямо сейчас у меня есть фильтр, в котором сокеты открываются в init, и по какой-то причине, когда я открываю их в doFilter (), он не работает с серверным приложением, поэтому у меня нет выбора, кроме как поместить его в INIT

Мне нужно иметь возможность ссылаться на outSide.println («тест»); в doFilter (), так что я могу отправлять это в свое серверное приложение каждый раз, когда оператор if в нем срабатывает.

Вот мой код:

import java.net.*;
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

public final class IEFilter implements Filter
{
  public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain)

    throws IOException, ServletException
  {

    String browser = "";


        String blockInfo;

        String address =  request.getRemoteAddr();

    if(((HttpServletRequest)request).getHeader ("User-Agent").indexOf("MSIE") >= 0)
        {
            browser = "Internet Explorer";
        }

    if(browser.equals("Internet Explorer")) {

       BufferedWriter fW = new BufferedWriter(new FileWriter("C://logs//IElog.rtf"));


        blockInfo = "Blocked IE user from:" + address;

        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<HTML>");
        out.println("<HEAD>");
        out.println("<TITLE>");
        out.println("This page is not available - JNetProtect");
        out.println("</TITLE>");
        out.println("</HEAD>");
        out.println("<BODY>");
        out.println("<center><H1>Error 403</H1>");
        out.println("<br>");
        out.println("<br>");
        out.println("<H1>Access Denied</H1>");
        out.println("<br>");
        out.println("Sorry, that resource may not be accessed now.");
        out.println("<br>");
        out.println("<br>");
        out.println("<hr />");
        out.println("<i>Page Filtered By JNetProtect</i>");
        out.println("</BODY>");
        out.println("</HTML>");

       //init.outSide.println("Blocked and Internet Explorer user");



            fW.write(blockInfo);

            fW.newLine();

            fW.close();

    } else {

      chain.doFilter(request, response);  


    }
  }

  public void destroy()
  {
        outsocket.close();
        outSide.close();
  }

  public void init(FilterConfig filterConfig)
  {

    try
    {
    ServerSocket fs;
    Socket outsocket;
    PrintWriter outSide ;

    outsocket = new Socket("Localhost", 1337);
    outSide = new PrintWriter(outsocket.getOutputStream(), true);

    }catch (Exception e){ System.out.println("error with this connection");  e.printStackTrace();}

  }
}

1 Ответ

0 голосов
/ 27 июля 2009

Другая возможность - использовать log4j, чтобы он обрабатывал обработку сокетов. log4j может быть сконфигурирован для хранения сообщений журнала из этого фильтра в отдельном файле от любого другого журнала. Это полностью исключило бы необходимость использования сокетов в вашем коде.

...