Paramètres du contrôleur (Paramètre)
Le module WebMVC rend non seulement l'écriture des contrôleurs très simple, mais le traitement des paramètres de requête devient également plus facile ! WebMVC convertira automatiquement le type de données correspondant au paramètre de méthode ou au membre de classe en fonction de la configuration de l'annotation du paramètre de méthode du contrôleur ou du membre de classe. La liaison de paramètre implique les annotations suivantes :
Annotation du paramètre de base
@RequestParam. : Lier les paramètres dans la requête ;
@RequestHeader : Lier les variables de paramètre dans l'en-tête de la requête ; paramètres :
- value : nom du paramètre, s'il n'est pas spécifié, le nom de la variable du paramètre de méthode sera utilisé par défaut ; prefix : préfixe du nom du paramètre, la valeur par défaut est ""
Annotations de paramètres spéciaux
@P athVariable : variable de paramètre de chemin de mappage de demande de liaison dans ;valeur : nom du paramètre, s'il n'est pas spécifié, le nom de la variable du paramètre de méthode est utilisé par défaut :
@Controller @RequestMapping("/demo") public class DemoController { @RequestMapping("/param") public IView testParam(@RequestParam String name, @RequestParam(defaultValue = "18") Integer age, @RequestParam(value = "name", prefix = "user") String username, @RequestHeader(defaultValue = "BASIC") String authType, @CookieVariable(defaultValue = "false") Boolean isLogin) { System.out.println("AuthType: " + authType); System.out.println("IsLogin: " + isLogin); return View.textView("Hi, " + name + ", UserName: " + username + ", Age: " + age); } }
http://localhost:8080/demo/param?name=webmvc&user.name=ymper
控制台输出: AuthType: BASIC IsLogin: false 浏览器输出: Hi, webmvc, UserName: ymper, Age: 18
: Les variables de paramètre basées sur le chemin doivent être continues, telles que :
Correct : /path/{name}/ {age}
Erreur :/path/{name}/age/{sex}
@ModelBind : annotation de liaison du paramètre d'objet de valeurprefix : préfixe du nom du paramètre lié, paramètre facultatif, la valeur par défaut est "" ;Exemple de code :Accès au test d'URL via le navigateur :@Controller @RequestMapping("/demo") public class DemoController { @RequestMapping("/path/{name}/{age}") public IView testPath(@PathVariable String name, @PathVariable(value = "age") Integer age, @RequestParam(prefix = "user") String sex) { return View.textView("Hi, " + name + ", Age: " + age + ", Sex: " + sex); } }
http://localhost:8080/demo/path/webmvc/20?user.sex=F
- Résultats d'exécution :
Hi, webmvc, Age: 20, Sex: F
@ParameterEscape : annotation d'échappement des paramètres de la méthode du contrôleur ;
Vous pouvez configurer les paramètres via le module WebMVC
parameter_escape_order
设定是在控制器方法参数执行验证之前还是之后执行参数转义动作,参数取值范围为before
或after
,默认为after
C'est-à-dire échapper après la vérification des paramètresscope : plage d'échappement des paramètres de chaîne, la valeur par défaut est Type.EscapeScope.DEFAULT ;
- La plage de valeurs comprend : JAVA, JS, HTML, XML, SQL, CSV, DEFAULT ;
- Valeur par défaut DEFAULT, qui termine l'échappement de SQL et HTML
ignoré : notifie l'annotation parent L'opération d'échappement du ; la méthode ou le paramètre actuel sera ignoré et la valeur par défaut est false ;
processeur : processeur d'échappement de paramètres de chaîne personnalisé ;
- Une logique d'échappement personnalisée peut être implémentée via l'interface IParameterEscapeProcessor ; Exemple de code 1 :
public class DemoVO { @PathVariable private String name; @RequestParam private String sex; @RequestParam(prefix = "ext") private Integer age; // 省略Get和Set方法 } @Controller @RequestMapping("/demo") public class DemoController { @RequestMapping("/bind/{demo.name}") public IView testBind(@ModelBind(prefix = "demo") DemoVO vo) { String _str = "Hi, " + vo.getName() + ", Age: " + vo.getAge() + ", Sex: " + vo.getSex(); return View.textView(_str); } }
Test d'URL d'accès via le navigateur :
http://localhost:8080/demo/bind/webmvc?demo.sex=F&demo.ext.age=20
Résultats de l'exécution : (Sortie de la console)
Exemple 1 de description :Hi, webmvc, Age: 20, Sex: F
Parce que la classe contrôleur est déclaré avec l'annotation @ParameterEscape, cela signifie que tous les paramètres de requête dans toute la classe du contrôleur doivent être échappés, donc le contenu du paramètre content est échappé avec succèsParce que le paramètre desc déclare @ParameterEscape La valeur ignorée dans l'annotation ; est défini sur true, ce qui signifie que les paramètres de niveau supérieur sont ignorés, de sorte que le contenu du paramètre n'est pas échappé.
- Exemple de code deux :
@Controller @RequestMapping("/demo") @ParameterEscape public class DemoController { @RequestMapping("/escape") public IView testEscape(@RequestParam String content, @ParameterEscape(skiped = true) @RequestParam String desc) { System.out.println("Content: " + content); System.out.println("Desc: " + desc); return View.nullView(); } } // 或者:(两段代码执行结果相同) @Controller @RequestMapping("/demo") public class DemoController { @RequestMapping("/escape") @ParameterEscape public IView testEscape(@RequestParam String content, @ParameterEscape(skiped = true) @RequestParam String desc) { System.out.println("Content: " + content); System.out.println("Desc: " + desc); return View.nullView(); } }
Accédez au test d'URL via le navigateur :
http://localhost:8080/demo/escape?content=<p>content$<br><script>alert("hello");</script></p>&desc=<script>alert("hello");</script>
Résultat de l'exécution : (Sortie de la console)
Content: <p>content$<br><script>alert("hello");</script></p> Desc: <script>alert("hello");</script>
Puisque le paramètre desc déclare l'annotation @ParameterEscape, indiquant que le paramètre doit être échappé, le contenu du paramètre est échappé avec succès ; RemarqueLa classe de contrôleur singleton a été instanciée lorsque le module WebMVC est initialisé ;: Lorsque la classe et la méthode du contrôleur déclarent l'annotation @ParameterEscape, l'annotation déclarée sur la classe sera considérée comme invalide
Utilisation spéciale d'un contrôleur non singleton
Contrôle Singleton La différence entre contrôleurs et contrôleurs non singleton :
La classe de contrôleur non singleton créera un objet instance à chaque fois qu'une requête est reçue, l'objet instance est libéré. une fois la demande terminée ;
Sur la base de la description ci-dessus, les contrôleurs non singleton peuvent recevoir les paramètres de la demande via les membres de la classe. L'exemple de code est le suivant :
@Controller @RequestMapping("/demo") @ParameterEscape public class DemoController { @RequestMapping("/escape2") @ParameterEscape(skiped = true) public IView testEscape2(@RequestParam String content, @ParameterEscape @RequestParam String desc) { System.out.println("Content: " + content); System.out.println("Desc: " + desc); return View.nullView(); } }
Accès au test d'URL via le navigateur :
http://localhost:8080/demo/escape2?content=<p>content$<br><script>alert("hello");</script></p>&desc=<script>alert("hello");</script>
Content: <p>content$<br><script>alert("hello");</script></p> Desc: <script>alert("hello");</script>
Remarque : En mode singleton, le module WebMVC ignorera l'attribution de valeurs aux membres de la classe de contrôleur. Il est également recommandé de ne pas utiliser de variables membres comme paramètres en mode singleton. Des conséquences inattendues peuvent survenir dans un environnement multithread simultané. . question! !