0

我尝试开发服务器端 API。我正在使用 GraphQL 并想从服务器端设置一个 cookie,但是当我尝试使用HttpServletResponse它设置 cookie 时,我得到了一个NullPointerException?

这是我的响应视图类:

package org.jembi.appstore.service.graphql.api.response.view;

public class ResponseView {

    private int code;
    private String message;

    public int getCode() {
        return code;
    }
    public void setCode(int code) {
        this.code = code;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
}

我在这里设置cookie:

@GraphQLMutation(name="login")
public ResponseView login(@GraphQLArgument(name="msisdn") String msisdn, @GraphQLArgument(name="password")String password, HttpServletResponse response) {

    ResponseView responseView = new ResponseView();
    User user = new User();


    System.out.println(msisdn.length());
    Cookie cookie = null;
    if(msisdn.length()==10) {
        user.setPassword(password);
        user.setMsisdn(msisdn);

        int code = userDao.getUser(user);
        responseView.setCode(code);
        if(code==100) {
            responseView.setMessage("User Logged In Successfully");

            cookie = new Cookie("token", UUID.randomUUID().toString());
            //responseView.doPost(req, resp);
            int hour = 3600000;
            int exp = 14 * 24 * hour; //2 weeks

            cookie.setMaxAge(exp);
            //cookie.setPath("/");
            cookie.setHttpOnly(true);
            response.addCookie(cookie);
            //responseView.setCookie(cookie);

        }   
        else 
            responseView.setMessage("Invalid credentials");

    }else {
        responseView.setCode(400);
        responseView.setMessage("Bad Request");
    }
    return  responseView;
}
4

2 回答 2

0

从代码看来,您正在使用 GraphQL SPQR。我不知道您是否也在使用 SPQR Spring Starter,所以我只需要假设您是,因为您的问题没有提及。

在最近的版本中,自动提供一个实例DefaultGlobalContext<NativeWebRequest>作为 GraphQL 上下文,因此它可以通过以下方式注入@GraphQLRootContext

@GraphQLMutation(name="login")
public ResponseView login(
     @GraphQLArgument(name="msisdn") String msisdn, 
     @GraphQLArgument(name="password")String password,
     @GraphQLRootContext DefaultGlobalContext<NativeWebRequest> context) {

    HttpServletResponse response = context.getNativeRequest().getNativeResponse(HttpServletResponse.class);
    ... //do what you need to with the raw HTTP response
}

如果要提供不同的上下文,请注册一个自定义ServletContextFactory类型的 bean。

如果您不使用 SPQR Spring Starter,您必须确保自己通过以下方式提供适用的上下文ExecutionInput

ExecutionInput input = ExecutionInput.newExecutionInput()
        .query(graphQLRequest.getQuery())
        .operationName(graphQLRequest.getOperationName())
        .variables(graphQLRequest.getVariables())
        .context(response) //HttpServletResponse or whatever you need
        .build();
于 2019-08-01T11:54:31.563 回答
0

如果您使用 的是graphql-java-kickstart / graphql-java-servlet

假设你可以得到

DataFetchingEnvironment env

那么你可以这样做:

GraphQLServletContext context = env.getContext();
context.getHttpServletResponse().addCookie(cookie);
于 2020-04-11T22:02:15.163 回答