記錄維護一個老項目出現的問題

1、編碼問題,安卓傳過來的數據亂碼。
項目中有多個過濾器,需要把encode過濾器放在web.xml最前邊,可以解決

2、與安卓交互時,獲取session爲空,因爲瀏覽器是自動添加cookie 的,安卓在請求接口時需要自己添加,
3、在安卓上傳文件 接口,過濾器拿不到參數:解決方法
這是因爲過濾器不屬於spring容器,需要把 springmvc 中的文件上傳配置 放在 application。xml中,在容器啓動的時候註冊,然後在過濾器中拿到spring的上下文,判斷請求頭是否是上傳請求,進行一次轉換。具體代碼如下:

1、注意放在application.xml中。。。

<bean id="springContextUtil" class="cn.lonwin.common.util.SpringContextUtil"></bean><!---->


	<bean id="multipartResolver"
		  class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
		<property name="maxUploadSize" value="209715200" />
		<property name="maxInMemorySize" value="4096" />
	</bean>

2、獲取容器對象工具類

package cn.lonwin.common.util;
import java.util.Locale;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
/**
 * @Author 學良
 * @Date2020/5/12 15:12
 **/


public final class SpringContextUtil implements ApplicationContextAware  {
    private static ApplicationContext context;

    @Override
    public void setApplicationContext(ApplicationContext contex)
            throws BeansException
    {
        System.out.println("--------------------contex---------"+contex);
        SpringContextUtil.context = contex;
    }


    public static ApplicationContext getApplicationContext() {
        return context;
    }

    public static Object getBean(String beanName) {
        return context.getBean(beanName);
    }

    public static String getMessage(String key) {
        return context.getMessage(key, null, Locale.getDefault());
    }

}

3、過濾器的處理

// 用於創建MultipartHttpServletRequest
    private MultipartResolver multipartResolver = null;

    public void init(FilterConfig arg0) throws ServletException {
        // TODO Auto-generated method stub
        // 注入bean
        multipartResolver = (MultipartResolver) SpringContextUtil.getBean("multipartResolver");
        System.out.println(multipartResolver);
    }

    /**
     * 獲取 request
     * @param req
     * @return
     */
    private ServletRequest getRequest(ServletRequest req){
        String enctype = req.getContentType();
        if (StringUtils.isNotEmpty(enctype) && enctype.contains("multipart/form-data"))
            // 返回 MultipartHttpServletRequest 用於獲取 multipart/form-data 方式提交的請求中 上傳的參數
            return multipartResolver.resolveMultipart((HttpServletRequest) req);
        else
            return req;
    }

剩下的就是處理自己的邏輯業務,這樣就可以在過濾器中獲取上傳表單的參數了。

總結:過濾器是servlet的產物,Interceptor是springmvc的產物,在容器初始化的時候,並沒有將filter加載進來,所以需要自己處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章