{"id":7589,"date":"2023-02-14T14:23:55","date_gmt":"2023-02-14T05:23:55","guid":{"rendered":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=7589"},"modified":"2023-02-14T17:19:44","modified_gmt":"2023-02-14T08:19:44","slug":"spring-boot-login-annotation-%eb%a7%8c%eb%93%a4%ea%b8%b0","status":"publish","type":"post","link":"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=7589","title":{"rendered":"Spring Boot &#8211; Login annotation \ub9cc\ub4e4\uae30"},"content":{"rendered":"<h1>Spring Boot &#8211; Login annotation \ub9cc\ub4e4\uae30<\/h1>\n<p>\ub85c\uadf8\uc778 \uccb4\ud06c\ub97c \ud558\ub2e4\ubcf4\uba74 \ubc18\ubcf5\uc801\uc73c\ub85c \uc138\uc158\uc774\ub098 \ucfe0\ud0a4\uc5d0\uc11c \ub85c\uadf8\uc778 \uc0c1\ud0dc\ub97c \ud655\uc778\ud558\uace0,<br \/>\n\ub85c\uadf8\uc778 \uc815\ubcf4\ub97c <code>request.getAttribute<\/code> \ub4f1\uc73c\ub85c \uac00\uc838\uc640\uc57c \ud558\ub294 \uc0c1\ud669\uc774 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n<p>\ubc18\ubcf5\uc801 \ucf54\ub4dc\ub97c annotation \uc73c\ub85c \ub9cc\ub4e4\uc5b4 \ud30c\ub77c\ubbf8\ud130\ub85c \uc989\uc2dc \ubc1b\uc544\uc624\ub294 \ubc29\uc2dd\uc73c\ub85c \uc218\uc815\ud560 \uc218 \uc788\ub2e4.<\/p>\n<h2>\uae30\uc874 \ucf54\ub4dc<\/h2>\n<pre><code class=\"language-java\">@WebFilter(&quot;\/admin\/*&quot;)\npublic class LoginCheckFilter implements Filter {\n    @Override\n    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {\n        HttpServletRequest httpServletRequest = (HttpServletRequest) request;\n        HttpServletResponse httpServletResponse = (HttpServletResponse) response;\n\n        \/\/ \ub85c\uadf8\uc778 \uccb4\ud06c\ub97c \ub85c\uadf8\uc778 \uc815\ubcf4 DTO \uc0dd\uc131\n\n        httpServletRequest.setAttribute(&quot;loginInfo&quot;, loginInfo);\n\n        chain.doFilter(httpServletRequest, httpServletResponse);\n    }\n}<\/code><\/pre>\n<p>\ubaa8\ub4e0 \uba54\uc18c\ub4dc\uc5d0\uc11c \ub85c\uadf8\uc778 \uc815\ubcf4\ub97c <code>request.getAttribute<\/code> \ub4f1\uc73c\ub85c \uac00\uc838\uc640\uc57c \ud558\ub294 \uc0c1\ud669\uc774 \ubc1c\uc0dd\ud55c\ub2e4.<\/p>\n<pre><code class=\"language-java\">@Controller\n@RequiredArgsConstructor\npublic class UserController {\n\n    private final UserService service;\n\n    @GetMapping(&quot;\/admin\/user\/modify&quot;)\n    public String modify(HttpServletRequest request, HttpServletResponse response, ModelMap model, @RequestParam(value = &quot;id&quot;) Long userId) throws IOException {\n\n        \/\/ \uc0dd\uc131\ud55c \ub85c\uadf8\uc778 \uc815\ubcf4 DTO \ud398\uc774\uc9c0\uc5d0 \uc804\ub2ec\n        LoginInfoDto loginInfoDto = (LoginInfoDto) request.getAttribute(&quot;loginInfo&quot;);\n        model.addAttribute(&quot;loginInfo&quot;, loginInfoDto);\n\n        return &quot;\/admin\/userModify&quot;;\n    }<\/code><\/pre>\n<h2>annotation \uc0dd\uc131<\/h2>\n<p>LoginCheckFilter \ub294 \uadf8\ub300\ub85c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.<\/p>\n<h3>LoginInfo<\/h3>\n<pre><code class=\"language-java\">@Target(ElementType.PARAMETER)\n@Retention(RetentionPolicy.RUNTIME)\npublic @interface LoginInfo {\n}<\/code><\/pre>\n<h3>LoginInfoArgumentResolver<\/h3>\n<p>\ub85c\uadf8\uc778 \uc815\ubcf4\ub97c <code>HttpServletRequest<\/code> \uc5d0 \ub123\uc5c8\uc73c\ubbc0\ub85c,<br \/>\nHttpServletRequest \uc5d0\uc11c \ub85c\uadf8\uc778 \uc815\ubcf4\ub97c \uac00\uc838\uc635\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-java\">@RequiredArgsConstructor\n@Component\npublic class LoginInfoArgumentResolver implements HandlerMethodArgumentResolver {\n\n    private final HttpServletRequest httpServletRequest;\n\n    @Override\n    public boolean supportsParameter(MethodParameter parameter) {\n        boolean isLoginInfoAnnotation = parameter.getParameterAnnotation(LoginInfo.class) != null;\n        boolean isLoginInfoClass = LoginInfoDto.class.equals(parameter.getParameterType());\n\n        return isLoginInfoAnnotation &amp;&amp; isLoginInfoClass;\n    }\n\n    @Override\n    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {\n        return httpServletRequest.getAttribute(&quot;loginInfo&quot;);\n    }\n}<\/code><\/pre>\n<h3>LoginConfig<\/h3>\n<pre><code class=\"language-java\">@RequiredArgsConstructor\n@Configuration\npublic class LoginConfig implements WebMvcConfigurer {\n\n    private final LoginInfoArgumentResolver loginInfoArgumentResolver;\n\n    @Override\n    public void addArgumentResolvers(List&lt;HandlerMethodArgumentResolver&gt; resolvers) {\n        resolvers.add(loginInfoArgumentResolver);\n    }\n}<\/code><\/pre>\n<h3>Controller<\/h3>\n<p><code>@LoginInfo<\/code> \ub97c \uc774\uc6a9\ud574 \ub85c\uadf8\uc778 \uc815\ubcf4\ub97c \ubc1b\uc2b5\ub2c8\ub2e4.<\/p>\n<pre><code class=\"language-java\">@RequiredArgsConstructor\n@Controller\npublic class IndexController {\n\n    \/\/ ......\n\n    @GetMapping(&quot;\/&quot;)\n    public String index(Model model, @PageableDefault Pageable pageable, @LoginInfo LoginInfoDto user, @RequestParam Map&lt;String, String&gt; params) {\n        \/\/ ......\n\n        if (user != null) {\n            model.addAttribute(&quot;userName&quot;, user.getName());\n        }\n\n        model.addAttribute(&quot;posts&quot;, postsPagingService.search(pageable, postsSearchDto));\n        model.addAttribute(&quot;search&quot;, postsSearchDto);\n\n        return &quot;index&quot;;\n    }\n\n    \/\/ ......\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>Spring Boot &#8211; Login annotation \ub9cc\ub4e4\uae30 \ub85c\uadf8\uc778 \uccb4\ud06c\ub97c \ud558\ub2e4\ubcf4\uba74 \ubc18\ubcf5\uc801\uc73c\ub85c \uc138\uc158\uc774\ub098 \ucfe0\ud0a4\uc5d0\uc11c \ub85c\uadf8\uc778 \uc0c1\ud0dc\ub97c \ud655\uc778\ud558\uace0, \ub85c\uadf8\uc778 \uc815\ubcf4\ub97c request.getAttribute \ub4f1\uc73c\ub85c \uac00\uc838\uc640\uc57c \ud558\ub294 \uc0c1\ud669\uc774 \ubc1c\uc0dd\ud55c\ub2e4. \ubc18\ubcf5\uc801 \ucf54\ub4dc\ub97c annotation \uc73c\ub85c \ub9cc\ub4e4\uc5b4 \ud30c\ub77c\ubbf8\ud130\ub85c \uc989\uc2dc \ubc1b\uc544\uc624\ub294 \ubc29\uc2dd\uc73c\ub85c \uc218\uc815\ud560 \uc218 \uc788\ub2e4. \uae30\uc874 \ucf54\ub4dc @WebFilter(&quot;\/admin\/*&quot;) public class LoginCheckFilter implements Filter { @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,\u2026 <span class=\"read-more\"><a href=\"https:\/\/www.skyer9.pe.kr\/wordpress\/?p=7589\">Read More &raquo;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[29],"tags":[],"class_list":["post-7589","post","type-post","status-publish","format-standard","hentry","category-spring-boot-2-5"],"_links":{"self":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/7589","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=7589"}],"version-history":[{"count":8,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/7589\/revisions"}],"predecessor-version":[{"id":7599,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/7589\/revisions\/7599"}],"wp:attachment":[{"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=7589"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=7589"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.skyer9.pe.kr\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=7589"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}