SpringMVC寻找Controller技巧

  • A+

控制器Controller

  在SpringMVC 中,控制器Controller负责处理由DispatcherServlet分发的请求,其将用户请求的数据经过业务处理层(service)处理之后封装成一个Model ,然后再把该Model返回给对应的View进行展示。

  通俗地讲,Controller是能被用户访问到的接口(对应的参数、访问用户可控),负责业务的封装以及页面的跳转,通过梳理对应的接口检查对应的业务实现,检查对应的sql逻辑,能帮助我们快速的检索代码中存在的漏洞缺陷。

SpringMVC Controller配置方式

基于注解

  比较常见的一种配置方式,在spring的配置文件中使用<context:component-scan>标签设置扫描指定包(也可以使用注解的方式代替,相关注解@ComponentScan),当发现有指定注解时,那么该类将由Spring进行管理。例如如下配置为扫描com.springmvc.test包以及子包:

xml
<context:component-scan base-package="com.springmvc.test.*"></context:component-scan>

  使用@ComponentScan方式指定要扫描的包:

```java
import org.springframework.context.annotation.ComponentScan;

@Configuration
@ComponentScan(value = "com.springmvc.test")
public class SpringContextConfig {

}
```

  完成相应配置后,结合如下两个注解即可完成controller的配置:

  • @Controller:一般标记在一个类上,使用它标记的类就是一个SpringMVC Controller 对象。分发处理器将会扫描使用了该注解的类的方法,并检测该方法是否使用了@RequestMapping 注解。
  • @RequestMapping:用于映射URL 到控制器类,或者是到Controller 控制器的具体处理方法上。这里一般可以标记在两个位置:
  • Controller 类
  • Controller 类的具体方法

  在Controller类上标记@RequestMapping注解是相对于Controller类的具体方法而言的,当Controller 类上没有标记@RequestMapping 注解时,方法上的@RequestMapping 都是绝对路径/。

  例如下面的例子,当需要调用Controller里的getUserInfo方法时,使用绝对路径/userInfo访问即可调用对应的接口:

java
@Controller
public class UserController {
@RequestMapping("/userInfo")
public String getUserInfo(HttpServletRequest request)
......
return "userInfo";
}
}

  若在Controller类上使用了@RequestMapping注解进行标记,例如下面的例子,因为在控制器上加了@RequestMapping 注解,所以当需要调用到里面使用了@RequestMapping 标记的方法getUserInfo的时候,就需要结合相对关系,即访问/user/Info:

java
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping("/Info")
public String getUserInfo(HttpServletRequest request)
......
return "userInfo";
}
}

  这样通过注解的方式简单的完成了Controller的配置。

配置Controller的Bean

  除了使用注解的方式,还可以在对应的xml配置文件中通过配置Controller相关的bean来实现。

  需要在spring的配置文件中做如下配置:

xml
<!-- HandlerMapping -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
<!-- HandlerAdapter -->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />
<!-- 处理器 -->
<bean name="/userInfo" class="com.springmvc.test.UserController" />

  相关的作用如下:

  • BeanNameUrlHandlerMapping:表示将请求的URL与Bean名字进行映射。
  • SimpleControllerHandlerAdapter:表示所有实现了org.springframework.web.servlet.mvc.Controller接口的Bean可以作为Spring Web MVC中的Controller。

  这里配置了一个URL为/userInfo的Bean,对应的实现在com.springmvc.test.UserController,通过实现Controller接口,完成了简单的Controller实现,这样当访问/userInfo时,便会调用UserController里的handleRequest方法:

```java
package com.springmvc.test;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

public class UserController implements Controller{

@Override
public ModelAndView handleRequest(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
    // TODO Auto-generated method stub
    ModelAndView mv = new ModelAndView();
    mv.setViewName("userInfo");
    return mv;
}

}
```

  此外还可以通过统一集合,来进行Controller的配置,例如下面的例子:

xml
<bean id="UserController" class="com.springmvc.test.UserController" />
<bean id="......" class="......" />
<bean id="handlerMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="userInfo">UserController</prop>
<prop key="......">......</prop>
</props>
</property>
</bean>

  然后继承AbstractController并且实现对应的方法,这样当访问/userInfo时,同样的便会调用UserController里的handleRequest方法:

```java
package com.springmvc.test;

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

import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class UserController extends AbstractController{

@Override
protected ModelAndView handleRequestInternal(HttpServletRequest arg0, HttpServletResponse arg1) throws Exception {
    // TODO Auto-generated method stub
    ModelAndView mv = new ModelAndView();
    mv.setViewName("userInfo");
    return mv;
}

}
```

寻找SpringMVC控制器

  通过上述SpringMVC中controller的配置,可以简单的梳理出对应的方法:

  • 首先应该检查对应的spring配置文件,检查对应的扫描包以及bean配置
  • 然后通过配置文件反馈的信息,可以直接定位bean定义的以及注解标记的Contoller
  • 关键字检索
  • 命名规范(controller)
  • 两个重要的注解(@Controller、@RequestMapping)

  找到Controller后即可快速理解对应的接口业务,然后根据对应的service实现以及dao层的SQL交互,结合Filter、Inteceptor过滤等场景进行漏洞缺陷的审计了。

相关推荐: Java代码审计之跨站脚本攻击

关于跨站脚本攻击   跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script…