hece
hece

Reputation: 364

my servlet mapping spoil my filter

In my program any url in the form of /Controller/* is redirected by my servlet mapping to Controller class.

I tried to add a filter for authantication, if user is not logged in and path is not /Controller/RegForm it's redirecting to /Controller/RegForm.

Problem is because my servlet mapping redirects to /Controller, filter always gets the /Controller as path.

How can I use both filter and the servlet mapping ?

This is my web.xml:

<filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>AuthFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/Controller/*</url-pattern>
</filter-mapping> 
 <servlet>
    <servlet-name>Controller</servlet-name>
    <servlet-class>Controller</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>Controller</servlet-name>
    <url-pattern>/Controller/*</url-pattern>
</servlet-mapping>

<session-config>
    <session-timeout>
        30
    </session-timeout>
</session-config>

my filter:

@WebFilter("/Controller/*")
public class AuthFilter implements Filter {

@Override
public void init(FilterConfig config) throws ServletException {
    // If you have any <init-param> in web.xml, then you could get them
    // here by config.getInitParameter("name") and assign it as field.
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;
    HttpSession session = request.getSession(false);
    String path = ((HttpServletRequest) request).getServletPath();

    if ((session != null && session.getAttribute("student") != null )||(excludeFromFilter(path))) {
            chain.doFilter(req, res); // Log 
        }
     else {
        response.sendRedirect("/registration-war/Controller/RegForm"); // No logged-in user found, so redirect to login page.
    }
}

private boolean excludeFromFilter(String path) {
    if (path.equals("/Controller/RegForm")) {
        return true; // add more page to exclude here
    } else {
        return false;
    }
}

Upvotes: 1

Views: 189

Answers (1)

icza
icza

Reputation: 418645

You use HttpServletRequest.getServletPath() which returns the servlet URL which is (according to your servlet mapping) "/Controller".

You want the path info not the servlet path:

Returns any extra path information associated with the URL the client sent when it made this request. The extra path information follows the servlet path but precedes the query string and will start with a "/" character.

So for example this will return "/RegForm" if your user requests the /Controller/RegForm page.

String pathInfo = HttpServletRequest.getPathInfo();

Upvotes: 1

Related Questions