user1352652
user1352652

Reputation: 425

WebFilter urlPattern not working

I'm trying to use WebFilter with JSF 2, but my filter not is working. The urlPattern is not recognized.

My Filter class:

@WebFilter(urlPatterns = {"/rws/*"})  
public class AuthorizationFilter implements Filter {  

    @Override  
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {      
        HttpServletRequest req = (HttpServletRequest) request;  
        HttpSession session = req.getSession(true);  
        Object o = session.getAttribute("user");  
        HttpServletResponse res = (HttpServletResponse) response;  

        if(o == null)   
            res.sendRedirect(req.getContextPath() + "/login.xhtml");  
        else
            chain.doFilter(request, response);  
    }  

    @Override  
    public void init(FilterConfig filterConfig) throws ServletException {  

    }  

    @Override  
    public void destroy() {  
    }  
}  

In my structure I want to protect all pages that are in the rws folder, but I could not configure the filter.

I've tried @ WebFilter ("/ rws / *") @ WebFilter ("/ faces / rws / *")

My filter never is executed!!

I noticed that the url does not change when I browse pages. For example, the user opens the index.xhtml performs login and then redirects to page loginOk.xhtml. LoginOk.xhtml page has links to pages that are in the folder rws.

When I click the link url does not change, ie, I'm browsing in a folder page rws but the url in the browser remains the same (http://jsftest.com:8080/TestePrimeFaces/faces/loginOK.xhtml). Is that the problem?

Used a commandLink as link, do not know if it is the most suitable. Does anyone know where is the problem?

Upvotes: 4

Views: 9232

Answers (2)

helong
helong

Reputation: 61

add "@Component" like this.

@Component
@WebFilter(urlPatterns = {"/rws/*"})  
public class AuthorizationFilter implements Filter { ...

Upvotes: 6

BalusC
BalusC

Reputation: 1108642

Servlet filters don't get triggered when you perform a non-redirect JSF navigation on postback. JSF navigation does namely by default not create a new HTTP request (which would trigger the filter), but it just changes the content of the HTTP response while still keeping the same HTTP request (that's also exactly why you don't see a change in browser's address bar).

Adding the FORWARD dispatcher to the filter mapping as some may suggest won't work as JSF on Facelets doesn't use RequestDispatcher#forward() unlike "plain" JSP/Servlet and many other MVC frameworks.

If you want to trigger the filter, just send a new request by a redirect.

So, instead of

public String login() {
    // ...

    return "home";
}

just do

public String login() {
    // ...

    return "home?faces-redirect=true";
}

If you worry about faces messages being lost due to the redirect, just make use of the flash scope.

See also:

Upvotes: 1

Related Questions