@ResponseBody @RequestMapping(value = "/test", method = RequestMethod.GET) public void test(HttpServletRequest req,HttpServletResponse resp) { resp.setStatus(401);
try { resp.getWriter().write("失败"); resp.getWriter().flush(); } catch (IOException e) { e.printStackTrace(); } }
在controller中这种,指定status为401直接通过reponse返回,ajax error中是可以收到的。
fiddler抓包为
HTTP/1.1 401 Access-Control-Allow-Origin: null Vary: Origin Access-Control-Allow-Credentials: true Date: Thu, 18 May 2017 05:07:36 GMT Content-Length: 2 ??
中文问题需要设置
resp.setCharacterEncoding("utf-8");
Content-Type: application/json;charset=UTF-8
需要在response返回前设置
response.setHeader("Access-Control-Allow-Origin", "*"); 即可正常使用
统一异常拦截实例:http://blog.csdn.net/u013111003/article/details/51953221
抛出创建异常实体时,将response传过去,并在构造方法中设置该句response.setHeader("Access-Control-Allow-Origin", "*")
该句不能在filter刚进入时就设置,会导致response立刻返回。
public class HttpStatusTokenException extends Exception { private static final long serialVersionUID = 1L; private String messageInfo; public HttpStatusTokenException(String messageInfo,HttpServletResponse resp) { super(messageInfo); this.messageInfo = messageInfo; resp.setHeader("Access-Control-Allow-Origin", "*"); } public String getMessageInfo() { return messageInfo; } public void setMessageInfo(String messageInfo) { this.messageInfo = messageInfo; } }
或者选择在 interceptor中设置
@Component("userRoleInterceptor")
@Configuration
public class UserRoleInterceptor extends HandlerInterceptorAdapter { @Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { if (!(handler instanceof HandlerMethod)) { return true; }
response.setHeader("Access-Control-Allow-Origin", "*");
}
}
前端js调用方法
$.ajax({ type: 'POST', url: 'http://localhost:9999/lottery/api/v1/luckuser/login', contentType:'application/json', data:JSON.stringify({ "userName": '1', "password": "null" }), success: function(res) { console.log(res) }, error:function(res) { console.log( JSON.parse(res.responseText).message) } });
浙公网安备 33010602011771号