其实蛮简单的,网上资料也多,就是工作中遇到了,记录一下。
现在比较流行的开发方式,不管前端是APP、网页、小程序,后端是微服务、分布式,涉及到登录登出,用户信息方面,多是基于JWT的Token方式,后端根据业务情况使用Filter或者Interceptor,采用纯解密JWT或基于缓存(本地、Redis等)等方案来进行整个生命周期的管理。
这里过来的HTTP请求基本上都是Ajax请求。
不过在很多ToB项目、老系统中,基于Session的用户信息管理,HTTP请求中,页面、Ajax请求混杂。
我这两天就遇到了这个情况:
1、要用Filter针对几个请求做处理。
2、不符合要求的必须重定向到另一个服务提供的接口。
3、基本都是页面请求,唯有一个是Ajax请求。
页面请求的重定向比较简单,
response.sendRedirect(URL);
或者
request.getRequestDispatcher(URL).forward(request, response);
二者的区别就不再说了,很基础的知识。
我遇到的问题就是,这是一个Ajax请求,而重定向的URL是个页面,请求方必须跳转到那个页面进行后续操作。
这情况其实就很烦了,如果重定向的URL也是个接口,这事好办了,服务端直接HTTP请求过去,拿到结果返回给请求方就行了。
如果请求方是个普通的页面请求也方便了,重定向即可。
现在Ajax-服务端-重定向页面,这种局面,就需要前后端同时改造。
后端Filter:
import java.io.IOException;
import java.util.Objects;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DemoFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
String url = req.getServletPath();
// TODO 排除不需要过滤的请求
// if (不需要过滤的请求) {
// chain.doFilter(request, response);
// }
// Ajax请求
if (Objects.nonNull(req.getHeader("X-Requested-With"))
&& req.getHeader("X-Requested-With").equals("XMLHttpRequest")) {
// TODO 过滤逻辑
// 重定向
// 设置与前端约定好的状态
resp.setStatus(401);
// 设置与前端约定好的 是否跳转标识,0不跳转,1跳转
resp.setIntHeader("redirectFlag", 1);
resp.setHeader("redirectUrl", "重定向的URL");
resp.flushBuffer();
} else {
// TODO 非Ajax请求的处理
}
}
}
前端就比较简单了,接收到响应后,根据status、redirectFlag、redirectUrl进行相应处理即可。