Search code examples
javaweb-servicesjakarta-eejax-rsjava-ee-6

JAX-RS @FormParam one time for all methods


I am developing Java "JAX-RS" Web Services for books and contents. There will be 100s of URLs something similar ...

https://api.example.com/v1.3/book1/chapter/1

https://api.example.com/v1.3/book1/chapter/2

...

https://api.example.com/v1.3/book1/chapterN

To fetch the chapter content user needed to POST authToken, which I validate in server and return content or error. The sample code ...

@Path("/book1")
public class Book1 {

    @Path("/chapter/{cNum}")
    public String getMedias(
            @PathParam("cNum") String cNum, 
            @FormParam("authToken") String authToken) {
        // so here I validate the authToken
        return "bla bla!";
    }
}

This works perfectly. But I repeated @FormParam("authToken") in all 100s of methods like above. Is there a way that I can check only one time somewhere and remove from all methods? Thank you so much!


Solution

  • This will filter the required parameters before processing.

    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter(urlPatterns = {"/*"}, description = "Filters!")
    public class MyFilter implements Filter {
        private FilterConfig filterConfig;
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            this.filterConfig = filterConfig;
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            final String authToken = servletRequest.getParameter("authToken");
            if (authToken != null) {
                // and token is valid ? // etc etc ...
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                // not valid
                servletResponse.getWriter().write("No Way! No Token!");
            }
        }
    
        @Override
        public void destroy() {
        }
    }
    

    This is helpful, if you want to check the security token or database connection or log URLs before processing the request.