2017년 7월 24일 월요일

인터셉터 이용하여 로그인 후 전 페이지로 이동


새로운 패키지를 만들어서 interceptor 클래스를 만들어 준다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
public class MyInterceptor extends HandlerInterceptorAdapter{
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String path = request.getServletPath();
        System.out.println(path);
        String query = request.getQueryString(); //파라미터가 있는지 없는지
        System.out.println(query);
        HttpSession httpSession = request.getSession();
        if(query != null){ //주소가 board?no=34&page=33
            httpSession.setAttribute("prev_url", path+"?"+query);
        }else//board
            httpSession.setAttribute("prev_url", path);
        }
        // TODO Auto-generated method stub
        return true//super.preHandle(request, response, handler);
    }
    
}
 
cs

HandlerInterceptorAdapter를 상속 받고

public class MyInterceptor extends HandlerInterceptorAdapter{

HandlerInterceptorAdapter에 있는 preHandle 을 오버로드 하여 재 정의 한다.

  @Override
    public boolean preHandle


 String path = request.getServletPath();
        System.out.println(path);
        String query = request.getQueryString(); //파라미터가 있는지 없는지
        System.out.println(query);


path과 query 를 찍어 보면 다음과 같은 경로를 가지고 있다.


query가 있을때는 query가 있는 주소로, 없을때는 path 주소를 담은 값을 session에 담아
set 한다.

 if(query != null){ //주소가 board?no=34&page=33
            httpSession.setAttribute("prev_url", path+"?"+query);
        }else//board
            httpSession.setAttribute("prev_url", path);
        }

return 값을 true로 해준다.( 아직 왜 true로 하는지는 잘 이해 못함)

 return true;


환경 설정을 해주어야 한다. 굳이 <annotation-driven />  밑에 안만들어도 될거같지만
찝찝하니까 저 위치 밑에 interceptors 태그를 만들어 준다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Servlet-context.xml
 
    <annotation-driven />
    
    <interceptors>
        <interceptor>
            <mapping path="/**" />
            <exclude-mapping path="/d2_login**" />
            <exclude-mapping path="/d2_logout**" />
            <exclude-mapping path="/resources**" />
            <exclude-mapping path="/resources/**" />
            <beans:bean class="com.ds.interceptor.MyInterceptor" />
        </interceptor>
    </interceptors>
 
 
cs

모든 주소에 적용 한다.

<mapping path="/**" />

exclude 해당 주소를 제외한다.

<exclude-mapping path="/d2_login**" />
            <exclude-mapping path="/d2_logout**" />
            <exclude-mapping path="/resources**" />
            <exclude-mapping path="/resources/**" />

아까 만들어준MyInterceptor 클래스의 위치를 입력해준다.
interseptor 패키지안에 있는 MyInterceptor 라고 적어 주었다.

<beans:bean class="com.ds.interceptor.MyInterceptor" />


환경설정이 끝났으면 어떻게 쓰는지 확인해 보자
사용방법은 간단하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Controller
 
    @RequestMapping(value = "d2_login", method = RequestMethod.POST)
    public String _login(@ModelAttribute("member")Exam1_member mem,
            HttpSession httpSession) {
        try {
            Exam1_member ret = d2DAO.login(mem);
            if(ret != null){
                if(!ret.getId().equals("")){
                    httpSession.setAttribute("id", ret.getId());
                    httpSession.setAttribute("name", ret.getName());
                    httpSession.setAttribute("level", ret.getLevel());
                    
                    String prev_url = (String)httpSession.getAttribute("prev_url");
                    
                    if(ret.getLevel() == 1){
                        d2DAO.updatePoint(ret.getId());
                        return "redirect:"+prev_url;
                    }
 
 
cs



 String prev_url = (String)httpSession.getAttribute("prev_url");

인터셉션이 exclude 지정한 페이지를 제외한 모든 페이지로 움직일때 마다 그 값을 저장하기 때문에 login에서 return 할때 prev_url 주소값을 입력함으로 그 전페이지로 redirect 하게 된다. 그래서 글쓰기 창 버튼을 클릭했을때 로그인 창이 떴다면 로그인 후 글쓰기창으로 이동 시키게 되는 것이다.

인터셉터의 자세한 설명은 해당 블로그 참조

http://hellogk.tistory.com/90


댓글 없음:

댓글 쓰기