解决ajax请求filter重定向失败
在新项目写了一个filter,能拦截jsp,.action的请求,但是ajax的请求可以拦截不能实现重写向登录页面。这是一个bug呀!
ajax重定向的问题。
默认ajax是不支持重定向的,因为ajax本身就是局部刷新,不重新加载页面的。如果需要用到重定向可以通过以下方法:
第一步:filter
- publicclassAgentLoginFilterextendsHttpServletimplementsFilter{
- privatestaticfinalLoglog=LogFactory.getLog(AgentLoginFilter.class);
- @Override
- voidinit(FilterConfigfilterConfig)throwsServletException{
- }
- voiddoFilter(ServletRequestsRequest,ServletResponsesResponse,FilterChainfilterChain)
- throwsIOException,ServletException{
- HttpServletRequestrequest=(HttpServletRequest)sRequest;
- HttpServletResponseresponse=(HttpServletResponse)sResponse;
- HttpSessionsession=request.getSession();
- Stringurl=request.getServletPath();
- StringcontextPath=request.getContextPath();
- Stringtype=request.getHeader("X-Requested-With")==null?"":request.getHeader("X-Requested-With");//XMLHttpRequest
- StringbasePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+contextPath+"/";
- if(url.equals("")){
- url+="/agent";
- }
- booleanisHasLogin=AgentSessionHelper.getHasLogined(request.getSession());
- if(!isHasLogin){
- if((url.startsWith("/agent")&&!url.startsWith("/agent/login/YSAgentLoginAction/login.action"))
- &&!url.startsWith("/agent/agentLogin.jsp")){
- if(StringUtils.equals("XMLHttpRequest",type)){
- //处理ajax请求
- response.setHeader("SESSIONSTATUS","TIMEOUT");
- "CONTEXTPATH",basePath+"agent/agentLogin.jsp");
- response.setStatus(HttpServletResponse.SC_FORBIDDEN);
- return;
- }else{
- response.sendRedirect(contextPath+"/agent/agentLogin.jsp");
- return;
- else{
- if(url.startsWith("/agent/agentIndex.jsp");
- filterChain.doFilter(sRequest,sResponse);
- }
第二步:在公共js 中写入
通过$.ajaxSetup()方法给ajax方法统一添加请求执行结束后,执行的操作。
- $.ajaxSetup({
- //设置ajax请求结束后的执行动作
- complete:
- function(XMLHttpRequest,textStatus){
- //通过XMLHttpRequest取得响应头,sessionstatus
- varsessionstatus=XMLHttpRequest.getResponseHeader("sessionstatus");
- if(sessionstatus=="TIMEOUT"){
- varwin=window;
- while(win!=win.top){
- win=win.top;
- win.location.href=XMLHttpRequest.getResponseHeader("CONTEXTPATH");
- });