Jack
Jack

Reputation: 197

Jersey filter giving server error

I am using jersey filter.
In My code logic in AuthenticationFilter.java, if the authorization header is empty, then return the access denied error message.
First time I am hitting the application through rest client tool using the URL without attaching the header

http://localhost:8080/JerseyDemos2/rest/pocservice

Get the status 401 with error message "you cannot access this resource". This is right.

When i tried to hit second time thorugh rest client tool, and server return the exception message.

I deployed my application in tomcat 7.x both windows and linux

Why it give the error when we hit the second time. How to resolve this

@Provider
public class AuthenticationFilter implements javax.ws.rs.container.ContainerRequestFilter {

@Context
private ResourceInfo resourceInfo;

private static final String AUTHORIZATION_PROPERTY = "Authorization";
private static final Response ACCESS_DENIED = Response.status(Response.Status.UNAUTHORIZED).entity("You cannot access this resource").build();  

@Override
public void filter(ContainerRequestContext requestContext) {    

        // Get request headers
        final MultivaluedMap<String, String> headers = requestContext.getHeaders();

        // Fetch authorization header
        final List<String> authorization = headers.get(AUTHORIZATION_PROPERTY);

        // If no authorization information present; block access
        if (authorization == null || authorization.isEmpty()) {
            requestContext.abortWith(ACCESS_DENIED);
            return;
        }
    }
}   }

Error message:

Dec 19, 2016 6:26:18 PM org.glassfish.jersey.server.ServerRuntime$Responder writeResponse
SEVERE: An I/O error has occurred while writing a response message entity to the container output stream.
java.lang.IllegalStateException: The output stream has already been closed.
at org.glassfish.jersey.message.internal.CommittingOutputStream.setStreamProvider(CommittingOutputStream.java:147)
at org.glassfish.jersey.message.internal.OutboundMessageContext.setStreamProvider(OutboundMessageContext.java:803)
......

Please help me Thanks in advance.

Upvotes: 0

Views: 1859

Answers (2)

Jack
Jack

Reputation: 197

I Removed static variable

private static final Response ACCESS_DENIED = Response.status(Response.Status.UNAUTHORIZED).entity("You cannot access this resource").build();

and i declared local variable. now its working fine.

@Provider
public class AuthenticationFilter implements javax.ws.rs.container.ContainerRequestFilter {

@Context
private ResourceInfo resourceInfo;

private static final String AUTHORIZATION_PROPERTY = "Authorization";

@Override
public void filter(ContainerRequestContext requestContext) {  
 Response ACCESS_DENIED = Response.status(Response.Status.UNAUTHORIZED).entity("You cannot access this resource").build();

    // Get request headers
    final MultivaluedMap<String, String> headers = requestContext.getHeaders();

    // Fetch authorization header
    final List<String> authorization = headers.get(AUTHORIZATION_PROPERTY);

    // If no authorization information present; block access
    if (authorization == null || authorization.isEmpty()) {
        requestContext.abortWith(ACCESS_DENIED);
        return;
    }
}
}   }

Upvotes: 1

Edwin Miguel
Edwin Miguel

Reputation: 409

You're trying to write in a response that was written before. The full log shows where is it happening. Upload the log and the code where the httpresponse is used/modified.

Upvotes: 0

Related Questions