Spring MVC访问controller动态处理被访问函数的参数

  公司项目通过前后端分离,提出一个需求。用户信息被node.js存储在request的header中,而后台使用的是Spring MVC通过@RequestBody注释,只能封装请求参数,header中的参数无法被封装成用户对象。

  解决方法:Spring MVC提供动态修改被访问的controller参数。

  

 

controller类
package com.ch.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; import com.ch.user.User; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.Map; /** * Created by CH on 2017/12/6/006. */ @RestController @RequestMapping("/admin") public class AdminController { /** *访问initAPI时,User会自动组装,组装函数在resolver类
  */ @RequestMapping("/init") public ModelAndView init(HttpServletRequest request, HttpServletResponse response, User user){ return new ModelAndView("", new HashMap<String, Object>()); } } 自定义用户类 package com.ch.user; /** * Created by CH on 2017/12/6/006. */ public class User { private String name; private Integer age; public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } resolver类 package com.ch.resolver; import com.ch.user.User; import org.springframework.core.MethodParameter; import org.springframework.web.bind.support.WebArgumentResolver; import org.springframework.web.context.request.NativeWebRequest; import javax.servlet.http.HttpServletRequest; /** * Created by CH on 2017/12/7/007.
* 访问controller中任何函数都会触发下面方法 */ public class BeanArgumentResolver implements WebArgumentResolver{   @Override   public Object resolveArgument(MethodParameter methodParameter, NativeWebRequest webRequest) throws Exception {     //methodParameter就是访问方法的参数对象,以下判断为被访问的方法参数不为空,并且被访问的参数为用户参数     if(methodParameter.getParameterType() != null && methodParameter.getParameterType().equals(User.class)){       HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);       //获取request中的请求对象,从header中获取,并封装返回       User user = new User();       if(request != null){         String name = request.getHeader("name");         String age = request.getHeader("age");         if(name != null && !name.isEmpty()){           user.setName(name);         }         if(age != null && !age.isEmpty()){           user.setAge(Integer.parseInt(age));         }       }       return user;     }     return UNRESOLVED;   } }

  

applicationContext.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<
beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:mvc="http://www.springframework.org/schema/c" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">   <!-- 自动扫描与装配 Service 和 Dao 层的 Bean -->   <context:component-scan base-package="com.ch">     <context:exclude-filter type="regex" expression=".*Controller$"/>   </context:component-scan> </beans> dispatcher-servlet.xml配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">   <!-- 此配置文件是配置需要扫描的控制层类 -->   <context:component-scan base-package="com.ch.controller"/>   <mvc:annotation-driven>     <mvc:argument-resolvers>       <bean class="com.ch.resolver.BeanArgumentResolver" />     </mvc:argument-resolvers>   </mvc:annotation-driven> </beans> web.xml配置 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">   <context-param>     <param-name>contextConfigLocation</param-name>     <param-value>classpath*:applicationContext*.xml</param-value>   </context-param>   <listener>     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>   </listener>   <servlet>     <servlet-name>dispatcher</servlet-name>     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>     <init-param>       <param-name>contextConfigLocation</param-name>       <!-- 显式指定 Spring MVC 控制器的配置文件 -->       <param-value>classpath:/dispatcher-servlet.xml</param-value>     </init-param>     <load-on-startup>1</load-on-startup>   </servlet>   <servlet-mapping>     <servlet-name>dispatcher</servlet-name>     <url-pattern>/</url-pattern>   </servlet-mapping>   <!-- 配置编码方式过滤器,注意:要配置在所有过滤器的前面 -->   <filter>     <filter-name>characterEncodingFilter</filter-name>     <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>     <init-param>       <param-name>encoding</param-name>       <param-value>UTF-8</param-value>     </init-param>     <init-param>       <param-name>forceEncoding</param-name>       <param-value>true</param-value>     </init-param>   </filter>   <filter-mapping>     <filter-name>characterEncodingFilter</filter-name>     <url-pattern>/</url-pattern>   </filter-mapping> </web-app> maven配置 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">   <modelVersion>4.0.0</modelVersion>   <groupId>com.helloword</groupId>   <artifactId>helloword</artifactId>   <version>1.0-SNAPSHOT</version>   <name>helloword</name>
  <properties>     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>     <spring.version>4.3.10.RELEASE</spring.version>   </properties>   <dependencies>   <!-- Spring Framework - Begin -->     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-aop</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-aspects</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-beans</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-context</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-context-support</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-core</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-expression</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-instrument</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-instrument-tomcat</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-jdbc</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-jms</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-messaging</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-orm</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-oxm</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-test</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-tx</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-web</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-webmvc</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-webmvc-portlet</artifactId>       <version>${spring.version}</version>     </dependency>     <dependency>       <groupId>org.springframework</groupId>       <artifactId>spring-websocket</artifactId>       <version>${spring.version}</version>     </dependency>   <!-- Spring Framework - End -->  
  <!-- Servlet - Begin -->   <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->     <dependency>       <groupId>javax.servlet</groupId>       <artifactId>javax.servlet-api</artifactId>       <version>3.1.0</version>       <scope>provided</scope>     </dependency>     <dependency>       <groupId>javax.servlet</groupId>       <artifactId>jstl</artifactId>       <version>1.2</version>     </dependency>   <!-- Servlet - End -->   </dependencies> </project>

 

posted @ 2018-01-10 10:40  浩天817  阅读(1623)  评论(0编辑  收藏  举报