You need to include <dispatcher> elements in your filter mappings for the Struts filter.

eg.

<filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
</filter-mapping>

With no <dispatcher> element specified, the container assumes you mean the filter chain only gets applied to requests.

The <dispatcher>FORWARD</dispatcher> element means the filter chain will get invoked when a servlet performs a forward (as your code does).

Just FYI - you may want to consider doing your protection with Interceptors, since it's a bit less clumsy than lugging around servlet filters with Struts.

You can very easily write an Interceptor[1] that will return a certain result type (say "denied") based on whether a specified attribute exists in the user's session. Doing so is left as an exercise to the reader :)

You're not then limited to using mappings in the web.xml, and all the logic is embedded in the framework you've chosen.

Struts' interceptors are a very powerful AOP-style pattern that I think are sometimes overlooked and aren't emphasised enough...

[1] http://struts.apache.org/2.x/docs/writing-interceptors.html

On 20 May 2009, at 13:42, Stefano Tranquillini wrote:

now is taked. but i've some problem with the dispacer.
i've an action mapped in this way:
      <action name="denied" >
           <result type="tiles">denied</result>
       </action>

namespace is /

if i manually put in this url:
http://localhost:8080//WAP-Shop-war/denied.action its WORKS.

the filter, else branch is this:
else {
           RequestDispatcher rd = null;
           rd = sc.getRequestDispatcher("/denied.action");
           rd.forward(myRequest, myResponse);
       }

and has to recall the same url see above, but he returns an error (404):

type Status report

message /WAP-Shop-war/denied.action

description The requested resource (/WAP-Shop-war/denied.action) is
not available.

but is available!

ideas?



On Wed, May 20, 2009 at 13:35, Andy Sykes <a.sy...@ucl.ac.uk> wrote:
Put the mapping for the admin filter above the struts2 filter. Filters are
invoked in the order in web.xml, first to last.

The struts filter is catching the request first and dispatching it before it
ever reaches the admin filter.

On 20 May 2009, at 09:37, Stefano Tranquillini wrote:

Hi all.
i need to block the path /admin/ for all the pepole. only the people
logged in as root can access it.
i've done a filter, but struts seems to dosen't works with its

 <filter>
      <filter-name>struts2</filter-name>

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</ filter-class>
  </filter>
  <filter>
      <filter-name>adminFilter</filter-name>
      <filter-class>filter.AdminFilter</filter-class>
  </filter>
  <filter-mapping>
      <filter-name>struts2</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>
  <filter-mapping>
      <filter-name>adminFilter</filter-name>
      <url-pattern>/admin/*</url-pattern>
  </filter-mapping>

public class AdminFilter implements Filter {

  FilterConfig fc;

  public AdminFilter() {
  }

  public void init(FilterConfig fc) throws ServletException {
      this.fc = fc;
  }

  public void doFilter(ServletRequest request, ServletResponse
response, FilterChain chain) throws IOException, ServletException {

      System.out.println("i'm the filter!");


HttpServletResponse myResponse = (HttpServletResponse) response;
      HttpServletRequest myRequest = (HttpServletRequest) request;
      String user = (String)
myRequest.getSession().getAttribute("logged");
      ServletContext sc = fc.getServletContext();
      if (user.equals("admin")) {


          String requestURI = myRequest.getRequestURI();
          int pathLength = myRequest.getContextPath().length();
          StringBuffer relativeURI = new
StringBuffer(requestURI.substring(pathLength));
          String query = myRequest.getQueryString();
          if (query != null) {
              relativeURI.append("?").append(query);
          }
          RequestDispatcher rd = null;
          if (relativeURI.toString().length() > 0) {
              rd = sc.getRequestDispatcher(relativeURI.toString());
          } else {
              rd = sc.getRequestDispatcher("/WAP-Shop-war/");
          }
          rd.forward(myRequest, myResponse);
      } else {
          RequestDispatcher rd = null;
          rd = sc.getRequestDispatcher("/WAP-Shop-war/");
          rd.forward(myRequest, myResponse);
      }
      return;
  }

  public void destroy() {
  }
}


when i put the url like:
http://localhost:8080/WAP-Shop-war/admin/showAddItem.action i see the
page and i don't see the string: i'm the filter!

where's the fault?

--
Stefano

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org





--
Stefano

---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org



---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscr...@struts.apache.org
For additional commands, e-mail: user-h...@struts.apache.org

Reply via email to