spring mvc处理ios 请求头不全时空参 无法解析的问题处理

ios前端比较懒~囧~~,还有已安装的app用户 ,不愿意更新等问题 导致 请求头无法补全给服务端springmvc发送过来。。。。。悲剧了

只能服务端自己处理这个不全的http请求空参无法解析的问题

尝试处理方法

1     增加springmvc过滤器对请求进行过滤(失败)

测试发现在访问控制层匹配请求地址之前就已经报错,应该是dispatcher那里出了问题

虽然失败, 把代码配置贴出来~~

applicationContext.xml

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**"/>
            <bean class="com.interceptor.ForIosParam"></bean>
        </mvc:interceptor>
    </mvc:interceptors>

ForIosParam.java

public class ForIosParam implements HandlerInterceptor {

@Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        StringBuffer url=request.getRequestURL();
        Map requestParams=request.getParameterMap();
        Method method=requestParams.getClass().getMethod("setLocked",new Class[]{boolean.class});
        method.invoke(requestParams,new Object[]{new Boolean(false)});
        requestParams.put("ForIosParam", "ForIosParam");
        Map map1=request.getParameterMap();
        request.getRequestURL().append("?ForIosParam=ForIosParam");
        request.setAttribute("ForIosParam", "ForIosParam");
        StringBuffer url1=request.getRequestURL();
        return true;
    }

}

2  使用servlet在接收到请求之后发送再次自己给自己发送一个http完整的请求 (失败,为毛请求发出去了,然后就没有然后了一点反应也木有。。。。必须异步的吗? 不管那么多了。。。换)这个网上搜就可以java发送http  post请求

3  使用 servlet利用post在接收到请求之后,增加参数再服务器跳转forward到springmvc 的get方式接收的方法里(失败啊。。。。。每次都是servlet拦截到。。。。。悲催  为毛   不管那么多 。。。。换)

代码如下

package com.util;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import com.model.umaiw_app_system;
import com.service.GetInitKeyService;
import com.service.GetTheBestServerService;
import com.service.implement.GetInitKeyServiceImpl;
import com.service.implement.GetTheBestServerServiceImpl;
import com.test.HttpRequest;

public class getTheBestServerServlet extends HttpServlet{

public void doPost (HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/json; charset=gb2312");  
         Map requestParams=request.getParameterMap();
            Method method;
            try {
                method = requestParams.getClass().getMethod("setLocked",new Class[]{boolean.class});
                method.invoke(requestParams,new Object[]{new Boolean(false)});
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (SecurityException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch (IllegalArgumentException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            }
            requestParams.put("ForIosParam", "ForIosParam");
            Map map1=request.getParameterMap();
            request.getRequestURL().append("?ForIosParam=ForIosParam");
            request.setAttribute("ForIosParam", "ForIosParam");
        ServletContext sc = getServletContext();    
        RequestDispatcher rd = null;    
        rd = sc.getRequestDispatcher(request.getRequestURI()); //定向的页面    
        rd.forward(request, response);    
        StringBuffer url=request.getRequestURL();
//        response.sendRedirect(url.toString());
    }
    
}

5 干脆 直接用servlet吧无参的http请求处理掉(成功啦~~ )

不过这种方式因为是单独走的servlet没有走spring mvc和spring框架的支持(木有jdbcTemplate,木有自动注入,木有数据库连接池~~~OMG  对付吧 ,不管三七二十一拼了,谁让他不补全标准的http请求哒)

代码如下(不能注入就实例化)

package com.util;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;

import com.model.umaiw_app_system;
import com.service.GetInitKeyService;
import com.service.GetTheBestServerService;
import com.service.implement.GetInitKeyServiceImpl;
import com.service.implement.GetTheBestServerServiceImpl;
import com.test.HttpRequest;

public class getTheBestServerServlet extends HttpServlet{

public void doPost (HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        GetInitKeyServiceImpl getInitKeyService=new GetInitKeyServiceImpl();
        GetTheBestServerServiceImpl getTheBestServerService= new GetTheBestServerServiceImpl();
        Map<String, String> map = new HashMap<String, String>();
        map.put("request", "getTheBestServer");
        map.put("status", "0");

//阿里云获取真实ip,这个也让人头疼。。。。。
        String ip=request.getHeader("X-Forwarded-For");
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getHeader("WL-Proxy-Client-IP");
        }
        if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
            ip = request.getRemoteAddr();
        }
        String initKey ="";
        umaiw_app_system uas = getInitKeyService.getinitKey(ip);
        if ( null== uas ) {
            String uuid = UUID.randomUUID().toString();
            initKey = uuid.substring(uuid.length()-8);
            
            String uuidkey = UUID.randomUUID().toString();
            String key = uuidkey.substring(uuidkey.length()-8);
            try {
                getTheBestServerService.insertKey(ip, initKey, new Date(),key);
            } catch (Exception e) {
                map.put("status", "1");
            }
        } else {
            initKey=uas.getInit_key();
        }

try {
            map.put("serverIp", DesUtil.encrypt(
            "XX.XX.XX.XX"(可以使负载均衡的ip),initKey));
        } catch (Exception e) {
            e.printStackTrace();
        }
        map.put("initKey", initKey);
        map.put("ip", ip);
        
        JSONObject jsonObject = JSONObject.fromObject(map);
        response.setContentType("text/html;charset=UTF-8");
        response.getWriter().write(jsonObject.toString());
    }
}

web.xml

<servlet>
    <servlet-name>getTheBestServerServlet</servlet-name>
    <servlet-class>com.util.getTheBestServerServlet</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>getTheBestServerServlet</servlet-name>
    <url-pattern>/system/getTheBestServer</url-pattern>
  </servlet-mapping>

数据库访问层用最基本的jdbc访问(别忘了使用完连接 关了它,,,,,)

附上 阿里云获取真实ip的tomcat下

server.xml最后一行的配置

<Valve className="org.apache.catalina.valves.AccessLogValve" pattern="%{X-Forwarded-For}i %h %l %u %t "%r" %s %b" suffix=".txt" prefix="localhost_access_log." directory="logs"/>

大功告成 这样就可以单独处理无参不全请求头的死ios的http请求啦。。。。。

时间: 2024-08-08 16:42:39

spring mvc处理ios 请求头不全时空参 无法解析的问题处理的相关文章

Spring MVC(二) HTTP请求数据的绑定

HTTP请求数据的绑定 通过注解绑定 @RequestParam-->绑定请求参.@RequestHeader-->绑定请求头参数.@CookieValue-->绑定Cookie的值.@PathVariable-->绑定URL中的 示例: @RequestMapping(value="/handle2")public String handle2(@CookieValue("JSESSIONID") String sessionId,@Req

spring mvc对异步请求的处理

在spring mvc3.2及以上版本增加了对请求的异步处理,是在servlet3的基础上进行封装的. 1.修改web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001

Spring源码阅读:Spring MVC 如何处理HTTP请求

Spring MVC 对HTTP请求的处理流程 通过之前的源码阅读,知道了ApplicationContext初始的过程,也知道了Spring MVC环境的初始化过程,今天就来了解一下SpringMVC是如何处理HTTP请求的. HTTP请求根据请求方式可以分为GET.POST.PUT.DELETE.OPTIONS.TRACE,最常用的还是GET和POST. Spring对于这几种HTTP请求的处理都是使用了processRequest(req,rep); @Override protected

Spring MVC 处理HTTP请求的整体流程

DispatcherServlet是一个前端控制器,是整个Spring MVC框架的核心组件.它在接收HTTP请求之后,根据请求调用Spring MVC中的各个组件. 常用接口及其含义: 1. Controller:被@Controller修饰的类是控制器类. 2. HandlerMapping:将用户请求映射到控制器. 3. HandlerInterceptor:拦截指定格式的URL请求. 4. ModelAndView:控制器处理完请求后,将视图的逻辑名称和模型数据封装成ModelAndVi

Spring MVC 接受的请求参数

[TOC] 1. 概述 Spring MVC 允许以多种方式将客户端的数据传送到控制器的处理方法中: 查询参数(Query Parameter) 表单参数(Form Parameter) 路径变量(Path Variable) 2. 详解 2.1 处理查询参数 查询参数都是String类型的,但当绑定到方法参数时会转换为相应的类型 在方法中使用 @RequestParam注解,同时可通过defaultValue属性设置当参数不存在时的默认值,如 public List<Spittle> spi

spring mvc+mybatis ios android整合cms内容发布平台

开发语言: java.ios.android 部署平台: linux.window jdk版本:JDK1.7以上版本 开发工具: eclipse.idea等 服务器中间件:Tomcat 6.7.Jboss 7.WebLogic 10.WebSphere 8 框架支持: springmvc.mybatis.shiro.restful.redis.sso单点登录 通用管理: 用户管理.角色管理.权限管理.动态菜单.数据字典管理.机构管理.区域管理.日志管理.日志监控.代码生成工具. 1.用户管理:用

Spring MVC 执行(请求--&gt;响应)流程

*每日一句:*每天起床之前有两个选择,要么继续趴下做你没做完的梦,要么起床完成你没有完成的梦想.-----** ----- 用户想服务器发型请求,请求被Spring的前端控制器DispatcherServlet截获. DispatcherServlet对请求URL(统一资源定位符)进行解析,得到URI(请求资源标识符).然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象,包括Handler对象以及Handler对象对应的拦截器,这些对象会被封装到一个Han

Spring MVC controller间跳转 重定向 传参 (转)

鸣谢:http://blog.sina.com.cn/s/blog_a85398ce0101f93x.html 1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 2. 解决办法 需求有了肯定是解决办法了,一一解决,说明下spring的跳转方式很多很多,我这里只是说一些自我认为好用的,常用的,spring分装的一些类和方法. (1)我在后台一个controller跳转到另一个

Spring MVC controller间跳转 重定向 传参

1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 2. 解决办法 需求有了肯定是解决办法了,一一解决,说明下spring的跳转方式很多很多,我这里只是说一些自我认为好用的,常用的,spring分装的一些类和方法. (1)我在后台一个controller跳转到另一个controller,为什么有这种需求呢,是这样的.我有一个列表页面,然后我会进行新增操作,新增在后台完成之后我