결론부터 먼저 작성하겠습니다.
package best.gaia.member.controller; import java.util.Optional; import javax.annotation.PostConstruct; import javax.inject.Inject; import javax.servlet.ServletContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.context.WebApplicationContext; import best.gaia.project.service.ProjectService; //(?!admin)(?!view)(?!restapi) 다중뎁스. //나머지 0뎁 @Controller @RequestMapping(value = "{mem_nick:^(?:(?!admin$|restapi$|view$|intro$|demo$|sales$|updates$|signin$|signup$|CS$).)*}") public class MemberTestController { @Inject private ProjectService service; @Inject private WebApplicationContext container; private ServletContext application; @PostConstruct public void init() { application = container.getServletContext(); } private static final Logger logger = LoggerFactory.getLogger(MemberTestController.class); @RequestMapping(value = "{membermenu:^(?:(?=help$|overview$|setting-setting$|setting-new$|setting-activity$)).*}") public String projectTemplate( @PathVariable String mem_nick , @PathVariable Optional<String> membermenu , Model model ) { model.addAttribute("mem_nick", mem_nick); System.out.println(mem_nick); model.addAttribute("pageParam", membermenu.isPresent() ? membermenu.get() : "overview"); return "member/member_template"; } }
💡*특정 문자 제외하기 @RequestMapping(value = "{mem_nick:^(?:(?!admin$|restapi$|view$|intro$|demo$|sales$|updates$|signin$|signup$|CS$).)}")
*특정 문자만 적용하기
@RequestMapping(value = "{membermenu:^(?:(?=help$|overview$|setting-setting$|setting-new$|setting-activity$)).}")
**?:을 적용하지 않았을 때 does not match the number of URI template variables it defines, which can occur if capturing groups are used in a URI template regex 에러가 발생합니다.
spring이 그룹을 자동으로 생성시켜 주어서 그렇다는데... 정확한 이유는... ㅠㅠ 추후에 알게 되면 알려주시길...
아래의 정규식을 처음 사용했었을 때는 잘 되었습니다만 알고보니 완전 잘못된 정규식이었습니다.
@RequestMapping(value = "{mem\_nick}/{project\_title:^.\*(?!setting)(?!activity)}") public String projectTemplate( @PathVariable String mem\_nick, @PathVariable String project\_title ,Model model ) { model.addAttribute("mem\_nick", mem\_nick); model.addAttribute("project\_title", project\_title); return "project/project\_template"; }
추후에 적용시켜볼 정규표현식이 있다면 해당 사이트에서 먼저 시험해 보시길 바랍니다.
실행 결과
restapi, view,,, 등등 모두 적용했을 경우 404 에러를 타게 됩니다.
@RequestMapping(value = "{mem\_nick:^(?:(?!admin$|restapi$|view$|intro$|demo$|sales$|updates$|signin$|signup$|CS$).)\*}")
restapi가 아니라 restapis 등 조금이라도 다르면 해당 uri를 잘 낚아채는것을 알 수 있습니다.
아래와 같이 첫번째 제외 정규표현식은 잘 지나쳤고 두번째 특정 단어만 낚아채는 정규표현식 역시 잘 작동합니다.
overview, help,, 등등 특정 단어만 낚아챕니다. 포함하는 단어가 아닐 경우(over와 같이) 이렇게 해당 경로를 무시하는 것을 볼 수 있습니다.
정규식이 많이 어렵네요. 해당 공부가 좀 더 많이 필요할 듯 합니다.
참고
https://github.com/spring-projects/spring-framework/issues/13101
https://www.javamex.com/tutorials/regular_expressions/non_capturing_groups.shtml
https://stackoverflow.com/questions/50173927/regex-error-use-non-capturing-groups-instead
'CS' 카테고리의 다른 글
[Container]Docker & Kubernates이란?? (0) | 2021.07.06 |
---|---|
[SSL]HTTPS 통신을 위한 SSL인증서 생성 (2) | 2021.05.22 |
[jsp] RestFull API 특정 주소 제외하기(실패) (3) | 2021.05.17 |
[Freenom] 도메인 등록하기 (4) | 2021.05.13 |
[Site] (Tistory)Google search-console 등록하기 (2) | 2021.05.13 |