手机端拦截器的问题,记录一下,以后备用。
APP每次调用接口的时候,需要在路径后加一个TOKEN,我需要做一个统一的处理,每次请求过来都得验证TOKEN是否有效。
开始的时候,preHandle方法只是返回一个boolean值,但APP要求返回一个code,表明是什么情况。
后来思考了一下,可以把这个拦截器的方法,继承baseController,在里面写一个公用的返回数据的方法,这样就解决了返回值只能是布尔值的问题,就可以传code了。
贴一下代码:
public class MobileInterceptor extends BaseController implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
String TOKEN=request.getParameter("TOKEN");
logger.debug("TOKEN======="+TOKEN);
//如果TOKEN是空并且不是登录请求直接返回
if(StringUtils.isBlank(TOKEN)&&!request.getRequestURI().contains("login/carLogin")) {
this.appException(response, "R10001", "TOKEN为空");
return false;
}
//如果TOKEN不是空,说明已经登录,获取登录人信息
User user=UserUtils.getByTOKEN(TOKEN);
if (user==null) {
this.appException(response, "R10002", "TOKEN失效");
return false;
}
return true;
}
……
}
这个是basecontroller里的方法
protected String appException(HttpServletResponse response, String code, String msg) {
try {
ResRslt result = null;
if(code.startsWith("S00")){
result = new ResRslt(1, code, msg);
}else{
result = new ResRslt(0, code, msg);
}
response.reset();
response.setContentType("application/json");
response.setCharacterEncoding("utf-8");
response.getWriter().print(JsonMapper.toJsonString(result));
return null;
} catch (IOException e) {
return null;
}
}