攔截器攔截 ajax代碼,以及亂碼處理

今天又學得了如何用攔截器攔截ajax,原來是異步的原因,所以要用不同的處理方法。之前用普通的攔截器,出現的現象就是跟沒用攔截器時的一樣。

首先要明白:

普通請求與ajax請求的報文頭不一樣,通過如下 

  1. String requestType = request.getHeader("X-Requested-With");  

  2. 如果requestType能拿到值,並且值爲XMLHttpRequest,表示客戶端的請求爲異步請求,那自然是ajax請求了,反之如果爲null,則是普通的請求

以下是驗證登陸的攔截器,代碼如下:

package com.bossin.vote.interceptor;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class VoteInterceptor implements Interceptor {
    private static final long serialVersionUID = 1L;

    public void destroy() {
    }

    public void init() {
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest req = ServletActionContext.getRequest();
        
        if(req.getSession().getAttribute("login_account")==null){
            HttpServletResponse response = ServletActionContext.getResponse();
            PrintWriter pw = response.getWriter();
            String flag = "";
            
            if (req.getHeader("X-Requested-With") != null
                    && req.getHeader("X-Requested-With").equalsIgnoreCase(     
                    "XMLHttpRequest")) {  
                        response.setCharacterEncoding("text/html;charset=utf-8");
                        response.setContentType("text/html;charset=utf-8");
                        flag = "請先登錄";
                        pw.write(flag);
                        return null;
            }
            
        }
        return invocation.invoke();

    }
}



struts.xml 配置跟普通的攔截器就是少了返回頁面的設置,具體 配置如下:

    <package name="vote" extends="struts-default">
               <!-- 攔截器 -->
        <interceptors>
            <!-- 登錄驗證 -->
            <interceptor name="VoteInterceptor" class="com.bossin.vote.interceptor.VoteInterceptor"></interceptor>
            <interceptor-stack name="verify">
                <interceptor-ref name="defaultStack"></interceptor-ref>
                <interceptor-ref name="VoteInterceptor"></interceptor-ref>
            </interceptor-stack>
        </interceptors>        
        <default-interceptor-ref name="verify"></default-interceptor-ref>
 
        <action name="vote" class="com.bossin.vote.action.VoteAction" method="execute"> </action>
    </package>


按上面的代碼是可以實現功能的,但會出現前臺彈出的窗口出現中文亂碼。

個人做以下處理便解決了中文亂碼:即把編碼設置放在 PrintWriter pw = response.getWriter();前面

package com.bossin.vote.interceptor;

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.ServletActionContext;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class VoteInterceptor implements Interceptor {
    private static final long serialVersionUID = 1L;

    public void destroy() {
    }

    public void init() {
    }

    public String intercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest req = ServletActionContext.getRequest();
        
        if(req.getSession().getAttribute("login_account")==null){
            HttpServletResponse response = ServletActionContext.getResponse();
            
            if (req.getHeader("X-Requested-With") != null
                    && req.getHeader("X-Requested-With").equalsIgnoreCase(     
                    "XMLHttpRequest")) {  
                        response.setCharacterEncoding("text/html;charset=utf-8");
                        response.setContentType("text/html;charset=utf-8"); //這兩句得放在pw前,否則出現亂碼
                        PrintWriter pw = response.getWriter();
                        String flag = "請先登錄";
                        pw.write(flag);
                        return null;
            }
            
        }
        return invocation.invoke();

    }
}

發佈了23 篇原創文章 · 獲贊 20 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章