如何处理包含正斜杠(/)的请求?

Jac*_*ack 36 java regex spring spring-mvc

我需要处理如下请求:

www.example.com/show/abcd/efg?name=alex&family=moore   (does not work)
www.example.com/show/abcdefg?name=alex&family=moore   (works)
www.example.com/show/abcd-efg?name=alex&family=moore   (works)
Run Code Online (Sandbox Code Playgroud)

它应该接受位于www.example.com/show/和之间的值的任何类型的字符?.请注意,那里的值将是单个值而不是操作的名称.

例如:/show/abcd/efg并且/show/lkikf?name=Jack其中第一个请求应该将用户重定向到页面abcd/efg(因为这是一个名称),第二个请求应该将用户重定向到页面lkikf以及参数名称的值.

我有跟随控制器来处理它,但问题是当我有/在地址控制器无法处理它.

@RequestMapping(value = "/{mystring:.*}", method = RequestMethod.GET)
public String handleReqShow(
            @PathVariable String mystring,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String family, Model model)     {
Run Code Online (Sandbox Code Playgroud)

我使用了以下正则表达式无法正常工作.

 /^[ A-Za-z0-9_@./#&+-]*$/
Run Code Online (Sandbox Code Playgroud)

Arp*_*wal 21

你必须创建两个方法,然后一个具有@RequestMapping(value = { "/{string:.+}" })注释,另一个具有@RequestMapping(value = { "/{string:.+}", "/{string:.+}/{mystring:.+}" }),然后在每个方法中相应地执行操作,因为您不能拥有可选的路径变量.

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller
@RequestMapping("/show")
public class HelloController {

    @RequestMapping(value = { "/{string:.+}" })
    public String handleReqShow(@PathVariable String string,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String family, Model model) {
        System.out.println(string);
        model.addAttribute("message", "I am called!");
        return "hello";
    }

    @RequestMapping(value = { "/{string:.+}", "/{string:.+}/{mystring:.+}" })
    public String whatever(@PathVariable String string,
            @PathVariable String mystring,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) String family, Model model) {
        System.out.println(string);
        System.out.println(mystring);
        model.addAttribute("message", "I am called!");
        return "hello";
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 21

我做的另一种方式是:

@RequestMapping(value = "test_handler/**", method = RequestMethod.GET)
Run Code Online (Sandbox Code Playgroud)

...并且您的测试处理程序可以是"/ test_hanlder/a/b/c",您将使用以下机制获得整个值.

requestedUri = (String) 
request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);
Run Code Online (Sandbox Code Playgroud)

  • 我最喜欢这个解决方案,因为它不需要你知道URL中的斜杠数量. (2认同)

Ank*_*ain 5

第一个不起作用,因为您正在尝试处理一个全新的 URL,该 URL 实际上并未映射到您的控制器。

www.example.com/show/abcd/efg?name=alex&family=moore   (does not work)
Run Code Online (Sandbox Code Playgroud)

上述 URL 的正确映射可能类似于以下代码。

@RequestMapping(value = {"/{mystring:.*}" , "/{mystring:.*}/{mystring2:.*}"}, method = RequestMethod.GET)
public String handleReqShow(
        @PathVariable String mystring,
        @PathVariable String mystring2,
        @RequestParam(required = false) String name,
        @RequestParam(required = false) String family, Model model)     {
Run Code Online (Sandbox Code Playgroud)

当我的一个控制器用于处理多种类型的请求时,我尝试过类似的概念。