2009-03-27 4 views
0

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

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

Heres мой код:

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();} 

    } 
} 

ответ

0

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