2009-03-26 4 views
3

Я написал класс фильтра, чтобы добавить заголовок P3P на каждую страницу. Я добавил это к моему web.xml:Фильтр сервлетов Java не работает при входе в систему

<filter> 
    <filter-name>AddP3pHeaderFilter</filter-name> 
    <filter-class>com.mycompany.AddP3pHeaderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>AddP3pHeaderFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

Он добавляет заголовок каждого запроса страницы, но она не работает, когда первый пользователь входит в систему пользователь отправляет форму на j_security_check, но ответ Безразлично. Включить заголовок. Как я могу применить фильтр к запросу на вход?

+0

+1: для добавления информации для поиска в сообщество – mkoeller

+0

Drat. На самом деле мое решение не сработало, поэтому я думаю, что это нормальный вопрос. –

ответ

1

Запрос на вход для перехода на соответствующую страницу. По умолчанию фильтры применяются только к запросам REQUEST. Вы должны изменить web.xml следующим образом:

<filter> 
    <filter-name>AddP3pHeaderFilter</filter-name> 
    <filter-class>com.mycompany.AddP3pHeaderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>AddP3pHeaderFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
    <dispatcher>REQUEST</dispatcher> 
    <dispatcher>FORWARD</dispatcher> 
</filter-mapping> 

EDIT: Я думал, что это была фиксированной, но я ошибся.

0

Большинство сервлетов-контейнеров действительно не разрешают крюки на /j_security_check запросах из соображений безопасности. Некоторые старые версии будут делать, но это должно быть исправлено в более новых версиях.

Лучший способ подключиться к этому в любом случае - проверить наличие принципала пользователя в HttpSession, который вы вручную разместили там, если он отсутствует.

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) { 
    HttpServletRequest httpRequest = (HttpServletRequest) request; 
    UserPrincipal user = httpRequest.getUserPrincipal(); 
    HttpSession session = httpRequest.getSession(); 
    if (user != null && session.getAttribute("user") == null) { 
     session.setAttribute("user", user); 

     // First-time login. You can do your intercepting thing here. 
    } 
    chain.doFilter(request, response); 
} 
+0

Если я правильно помню, метод doFilter даже не вызывался, когда пользователь вошел в систему. Я обновляю принятый ответ тем, что я сделал. –

0

Не знаю, кот, но это работает для меня в причалу, просто поставить фильтр перед весенним фильтром:

<filter> 
    <filter-name>AddP3pHeaderFilter</filter-name> 
    <filter-class>com.mycompany.AddP3pHeaderFilter</filter-class> 
</filter> 
<filter-mapping> 
    <filter-name>AddP3pHeaderFilter</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 

<filter> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
</filter> 

<filter-mapping> 
    <filter-name>springSecurityFilterChain</filter-name> 
    <url-pattern>/*</url-pattern> 
</filter-mapping> 
0

Мой web.xml

<filter> 
     <description> 
     FBIS Filter</description> 
     <display-name>Fbisfilter</display-name> 
     <filter-name>Fbisfilter</filter-name> 
     <filter-class>fbis.filter.Fbisfilter</filter-class> 
    </filter> 
    <filter-mapping> 
     <filter-name>Fbisfilter</filter-name> 
     <url-pattern>/*</url-pattern> 
    </filter-mapping> 

и MyFilter is

package fbis.filter; 

import java.io.IOException; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 

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

import com.sqlconnection.SQLConnect; 
import com.sun.security.auth.UserPrincipal; 

import fbis.interfaces.abstractclasses.Connections; 

/** 
* Servlet Filter implementation class Fbisfilter 
*/ 
public class Fbisfilter extends Object implements Filter,Connections { 
    public void destroy() { 
    // System.out.println("Filter Service finished"); 
    } 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest httpRequest = (HttpServletRequest) request; 
     HttpServletResponse httpresponse = (HttpServletResponse) response; 
     System.out.println("FILTER INSIDE"); 
    // place your code here 
     HttpSession session = httpRequest.getSession(true); 
     String usrid = httpRequest.getParameter("txtuname"); 
     String pwd = httpRequest.getParameter("txtpassword"); 
     PreparedStatement pstmt; 
     try { 
      pstmt = con 
        .prepareStatement("SELECT l.Userid,n.First_name from Login_details_dtls l join New_Registration_dtls n on l.Userid=n.Userid where n.Userid=? AND l.pwd=?"); 
     pstmt.setString(1, usrid); 
     pstmt.setString(2, pwd); 
     ResultSet rs = pstmt.executeQuery(); 
     if (rs.next()) { 
      session.setAttribute("usr", rs.getString("Userid")); 
      session.setAttribute("usrname", rs.getString("First_name")); 
     } 
     } catch (SQLException e) { 
      e.printStackTrace(); 
     } 
     chain.doFilter(httpRequest, httpresponse); 
    } 

    /** 
    * @see Filter#init(FilterConfig) 
    */ 
    public void init(FilterConfig fConfig) throws ServletException { 
     System.out.println("Filter Service has started"); 
    } 

}