The code should really stop here. If there is a filter that is not Filter.INCLUDE the contents of the tile may be different, or they might be empty, but there are a few things to take into consideration:
* the filter might not be geographic at all (maybe certain types of buildings are not visible to certain users)
* a WMS request on an area that is not allowed won't throw an exception, will simply return a blank

So, to make things right filter wise:
* if filter is missing or it's INCLUDE, return the cached tiles as is
* if the filter is EXCLUDE, build a blank tile and return it without any caching
* in any other case, the filter should be turned into a request parameter that causes the generation of a separate tile cache for that specific filter (maybe hash it, or turn it into a CQL_FILTER for example and have GWC machinery deal with it)

Also, DataAccessLimit is not the only way to filter data. CoverageAccessLimits and WMSAccessLimits do have a rasterFilter, a MultiPolygon, which is used to cut the imagery, this should be taken into consideration as well, I believe with the same logic (fully within the polygon, normal tile, fully outside, blank, at the border, create a parameter that induces a separate tile cache)