使用filter改變改變地址,但又不想被本過濾器再次攔截的方法
阿新 • • 發佈:2019-02-12
繼承HttpServletRequestWrapper重寫裡面的方法
如果是servlet重寫getRequestURI()
如果是spring mvc重寫 getServletPath()
可以根據getDispatcherType()類確定是那種排程型別,一般客戶端請求action,或controller都是REQUEST,controller跳轉到頁面是FORWARD。
package com.hlzt.bjcl.filter; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import com.hlzt.dev.core.common.AppContext; import com.hlzt.dev.web.context.HttpAppContext; import com.hlzt.dev.web.context.HttpContextFactory; import com.hlzt.dev.web.mvc.ContextVarsHelper; import com.hlzt.platform.grant.model.UserVO; public class MyFilter implements Filter{ public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) resp; String url =request.getRequestURI(); UserVO currentUser=(UserVO)HttpContextFactory.getContext(request, response).getContextUser(); if(currentUser!=null) { if(currentUser.getUsertype()<=0){//如果 boolean fbUrl=url.contains("/front/"); if(fbUrl) url="/404.d"; else if(url.contains("/back/")); else { url=url.substring(0, url.lastIndexOf("/"))+"/back"+url.substring(url.lastIndexOf("/")); } } else { boolean fbUrl=url.contains("/back/"); if(fbUrl) url="/404.d"; else if(url.contains("/front/")); else url=url.substring(0, url.lastIndexOf("/"))+"/front"+url.substring(url.lastIndexOf("/")); } } //System.out.println("請求前"+request.getServletPath()); chain.doFilter(new MyHttpServletRequestWrapper(request,url), response); // System.out.println("請求後"+request.getServletPath()); } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub } @Override public void destroy() { // TODO Auto-generated method stub } /** * 重新封裝request包裝類 * @author Administrator * */ class MyHttpServletRequestWrapper extends HttpServletRequestWrapper{ private String url; public MyHttpServletRequestWrapper(HttpServletRequest request,String url) { super(request); this.url=url; //System.out.println("####################url改變後"+request.getRequestURI()); } /*@Override public String getRequestURI() {//servlet根據這個獲得路徑 System.out.println("getRequestURI執行"); return "/bjcl/user/back/index.shtm"; }*/ /*@Override public StringBuffer getRequestURL(){ System.out.println("getRequestURL執行"); return new StringBuffer("/bjcl/user/back/index.shtm"); }*/ @Override public String getServletPath() {//spring mvc 根據這個方法獲得路徑 System.out.println(super.getMethod()+" "+super.getAuthType()+" "+super.getContentType()+" "+super.getDispatcherType().name()+"******************請求地址"+super.getServletPath()); if(super.getDispatcherType().name().equals("REQUEST"))//當是客服端請求伺服器型別時,設定新url //新url地址為spring mvc controller前的地址 return url; else//當不是請求型別時,此時為伺服器跳轉,轉發為FORWARD等等,預設伺服器跳轉地址 //伺服器跳轉的地址為/page/bjcl/order/user.jsp,是controller return後的地址。 return super.getServletPath(); } } }