CS

[jsp] RestFull API 특정 주소 제외하기(성공)

뱅타 2021. 5. 20. 23:22

결론부터 먼저 작성하겠습니다.

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";  
}

https://regexr.com/

추후에 적용시켜볼 정규표현식이 있다면 해당 사이트에서 먼저 시험해 보시길 바랍니다.

실행 결과

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

728x90
반응형