2009-03-26 8 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にフォームを送信するとき、それは動作しませんが、応答はdoesnの。ヘッダーは含めないでください。フィルタをログインリクエストに適用するにはどうすればよいですか?

+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

ちょうど春のフィルタの前に、あなたのフィルターを入れて、Tomcatを知っているが、それは桟橋で私の作品はいけない:

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

} 
関連する問題