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

2022-09-01 02:30:56

我需要按如下方式处理请求:

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)

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

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

我有以下控制器来处理它,但问题是当我有/在地址中控制器无法处理它时。

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

我使用了以下正则表达式,这不起作用。

 /^[ A-Za-z0-9_@./#&+-]*$/

答案 1

我做的另一种方式是:

@RequestMapping(value = "test_handler/**", method = RequestMethod.GET)

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

requestedUri = (String) 
request.getAttribute(HandlerMapping.PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE);

答案 2

您必须创建两个方法,然后一个具有注释,另一个具有注释,然后在每个方法中相应地执行操作,因为您不能有可选的路径变量。@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";
    }
}