控制器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过滤等场景进行漏洞缺陷的审计了。
关于跨站脚本攻击 跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意Script…
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论