记录维护一个老项目出现的问题

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加载进来,所以需要自己处理。

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