|
目标:
访问 http://localhost/preview/a.css 的时候,如果 preview 中并没有 a.css 这个文件,就接着访问 html/a.css
解决办法:
在filter 中 wraper 了 response ,得到 error code,发现是 404,就接着访问下一个。代码如下:
我觉得挺土的,有没有好办法取得 response 的 error code 呢?或是其它方法解决这个问题?
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;ServletResponseWraper wraper = new ServletResponseWraper(resp);chain.doFilter(request, wraper);if (wraper.getStatus() == HttpServletResponse.SC_NOT_FOUND) {if (isPreview(req)) {String path = getHtmlUrl(req);wraper.status = HttpServletResponse.SC_OK;req.getRequestDispatcher(path).forward(req, wraper);} else {wraper.getResponse().sendError(wraper.getStatus(), wraper.getRootMessage());}}}private String getHtmlUrl(HttpServletRequest req) {String path = req.getRequestURI().replaceFirst(req.getContextPath(), "");path = path.replaceFirst("/preview", "");path = "/html" + path;return path;}private boolean isPreview(HttpServletRequest req) {String path = req.getRequestURI().replaceFirst(req.getContextPath(), "");boolean isPreview = path.startsWith("/preview");return isPreview;}private class ServletResponseWraper implements HttpServletResponse {private HttpServletResponse response;private int status = HttpServletResponse.SC_OK;private String msg;private String rootMessage;public ServletResponseWraper(HttpServletResponse response) {while (response instanceof ServletResponseWraper) {ServletResponseWraper wraper = (ServletResponseWraper) response;setRootMessage(wraper.getRootMessage());setMessage(wraper.getMessage());response = wraper.getResponse();}this.response = response;}public HttpServletResponse getResponse() {return response;}public void setRootMessage(String message) {if (rootMessage == null)rootMessage = message;}public String getRootMessage() {return rootMessage;}public int getStatus() {return status;}public String getMessage() {return msg;}public void setMessage(String message) {setRootMessage(message);msg = message;}...public void sendError(int sc, String msg) throws IOException {status = sc;setMessage(msg);//response.sendError(sc, msg);}public void sendError(int sc) throws IOException {status = sc;//response.sendError(sc);}...} |
|