- JAVA 프로젝트

메뉴 부분은 여러 화면에서 쓰이기 때문에 Interceptor로 처리 했었다.

(TopMenuInterceptor에서 topMenuService를 가져와 메서드 호출해서 구성했다.)

때문에 로그인 전 후 처리도 이곳에서 해주면 된다.

 

JAVA 프로젝트의 경우 Interceptor에서는 Bean을 주입 받을 수 없다.

그렇기 때문에 Interceptor를 정의한 ServletAppContext에서 Bean을 주입 받아서 Interceptor로 전달을 해주면 된다.

 

1. ServletAppContext에서 loginUserBean을 주입 받아 Interceptor에 전달

package com.example.config;

...

@Configuration
@EnableWebMvc
@ComponentScan("com.example.controller")
@ComponentScan("com.exmaple.dao")
@ComponentScan("com.example.service")

@PropertySource("/WEB-INF/properties/db.properties")
public class ServletAppContext implements WebMvcConfigurer{
	
    ...

    @Autowired
    private TopMenuService topMenuService;

    // Session영역에 저장해 놓은 loginUserBean을 주입 받는다.
    @Resource(name = "loginUserBean")
    private UserBean loginUserBean;
    
    ...
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // TODO Auto-generated method stub
        WebMvcConfigurer.super.addInterceptors(registry);
        
	// TopmenuInterceptor에 위에서 주입 받은 loginUserBean을 넘겨준다.
        TopMenuInterceptor topMenuInterceptor = new TopMenuInterceptor(topMenuService, loginUserBean);

        InterceptorRegistration reg1 = registry.addInterceptor(topMenuInterceptor);
        reg1.addPathPatterns("/**");
    }

 

2. TopmenuInterceptor에서 위에서 지정한 loginUserBean을 전달 받는다.

package com.example.interceptor;

...

public class TopMenuInterceptor implements HandlerInterceptor{

	private TopMenuService topMenuService;
	private UserBean loginUserBean;
	
	public TopMenuInterceptor(TopMenuService topMenuService, UserBean loginUserBean) {
		this.topMenuService = topMenuService;
		this.loginUserBean = loginUserBean;
	}
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		List<BoardInfoBean> topMenuList = topMenuService.getTopMenuList();
		request.setAttribute("topMenuList", topMenuList);
		request.setAttribute("loginUserBean", loginUserBean);
		
		return true;
	}
}

 

3. WEB-INF/views/include/top_menu.jsp로 이동해서 메뉴 로그인 전 후 처리

<ul class="navbar-nav ml-auto">
    <c:choose>
        <c:when test="${loginUserBean.userLogin == true }">
            <li class="nav-item">
                <a href="${root }user/modify" class="nav-link">정보수정</a>
            </li>
            <li class="nav-item">
                <a href="${root }user/logout" class="nav-link">로그아웃</a>
            </li>
        </c:when>
        <c:otherwise>
            <li class="nav-item">
                <a href="${root }user/login" class="nav-link">로그인</a>
            </li>
            <li class="nav-item">
                <a href="${root }user/join" class="nav-link">회원가입</a>
            </li>
        </c:otherwise>
    </c:choose>
</ul>

 

 

4. 로그아웃 처리하기

UserController로 이동해서 loginUserBean 값에 false 처리

(UserBean.java에서 생성자를 통해 기본 값도 false로 줬다.)

public class UserBean {
	
    ...

    private boolean userIdExist;

    private boolean userLogin;

    public UserBean() {
        this.userIdExist = false;
        this.userLogin = false;
    }
@Controller
@RequestMapping("/user")
public class UserController {

    @GetMapping("/logout")
    public String logout() {
        loginUserBean.setUserLogin(false);

        return "/user/logout";
    }

 

 


- XML 프로젝트

XML 프로젝트의 경우 JAVA 프로젝트와 다르게 Interceptor에서 Bean을 주입 받을 수 있다.

 

1. Interceptor에서 loginUserBean을 전달 받는다.

package com.example.interceptor;

...

public class TopMenuInterceptor implements HandlerInterceptor{

	@Autowired
	private TopMenuService topMenuService;
	
	@Resource(name = "loginUserBean")
	@Lazy
	private UserBean loginUserBean;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		// TODO Auto-generated method stub
		List<BoardInfoBean> topMenuList = topMenuService.getTopMenuList();
		request.setAttribute("topMenuList", topMenuList);
		request.setAttribute("loginUserBean", loginUserBean);
		
		return true;
	}
}

 

나머지 설정은 JAVA프로젝트로 할 때와 동일하다.

+ Recent posts