是否可以在我的代码中使用缓存控制选项

Is it possible to Use Cache Control Option in my code

我有一个简单的 JERSEY WEBService,它负责 return 我们数据库中存在的状态

package com.services.regg;
@Path("/getstates")
public class FetchStates {
    @GET
    @Consumes("application/text")
    @Produces("application/json")
    public String getAllSates() throws JSONException
    {
        JSONArray jsonarray_allstates = new JSONArray();
        Connection dbConnection = null;
        PreparedStatement getAllStatesPst = null ;
        ResultSet getAllStatesResltSet = null;
        try
        {
            dbConnection = DBConnectionOrient.getDBConnection();
            getAllStatesPst = dbConnection.prepareStatement("select stateID , stateName from tbl_state ORDER BY stateName");
            getAllStatesResltSet = getAllStatesPst.executeQuery();
            while(getAllStatesResltSet.next())
            {
                JSONObject eachrecordjsonObj = new JSONObject();
                String stateID = getAllStatesResltSet.getString("stateID").trim();
                String stateName = getAllStatesResltSet.getString("stateName").trim();
                eachrecordjsonObj.put("stateID", stateID).put("stateName", stateName);
                if(!stateName.isEmpty() && !stateName.equals(""))
                {
                jsonarray_allstates.put(eachrecordjsonObj);
                }
            }
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            DBConnectionOrient.close(getAllStatesPst,getAllStatesResltSet);
            DBConnectionOrient.close(dbConnection);
        }
        String  response = "jsonCallback("+jsonarray_allstates.toString()+")";
        return response;
    }
}

一切正常。

由于这适用于移动应用程序,我们发现后端的响应非常慢

我想从我这边优化应用程序的性能。 为此,我看到了 Jersey Cache Control 。

CacheControl cc = new CacheControl();
cc.setMaxAge(86400);
cc.setPrivate(true);

ResponseBuilder builder = Response.ok(myBook);
builder.cacheControl(cc);
return builder.build();

我的问题是,是否可以在我的代码中使用 CacheControl,因为我直接发送字符串而不是 ResponseBuilder

如果可以,请告诉我如何修改我的代码以使用缓存控制?

只需将您的代码重组为 return Response 而不是 String。在使用 Response.ok(myBook); 的地方,只需将您的 jsonp response 传递给它而不是 myBook.

唯一的其他方法涉及直接操作 header。

如果你必须坚持使用Stringreturn类型,那么你可以注入HttpSerlvetResponse并设置header

@GET
public String getAllSates(@Context HttpServletResponse response) {
    CacheControl cc = new CacheControl();
    cc.setMaxAge(86400);
    cc.setPrivate(true);
    response.addHeader("Cache-Control", cc.toString());
    [...]
}

或者您可以在 ContainerResponseFilter 中添加 header,如果您不想在每个方法中都添加它的话。不确定您使用的是哪个 Jersey 版本,但是使用 Jersey 2.x,您可以确定将使用过滤器的方法,以便只有选定的资源才会通过此过滤器。不确定 Jersey 1.x,如果此功能可用。 2.x.

the documentation