springmvc 차단기 로그 인 검증 예시

7148 단어 springmvc차단기
처음에는 차단기 와 필 터 를 배 웠 는데 어떻게 보면 비슷 하지만 실제로는 크게 다르다.차단기 와 필터 로 각각 로그 인 검증 시험 을 했 고 이번 에는 차단기 부터 말 했다.다음은 자신 이 실천 한 실례 이다.
spring-mvc.xml 에 차단 기 를 설정 합 니 다:

<mvc:interceptors>
  <mvc:interceptor> 
   <mvc:mapping path="/user/*"/> 
<!--    mvc:interceptor                   -->
   <bean class="com.wyb.interceptor.LoginInterceptor"/> 
  </mvc:interceptor>  
 </mvc:interceptors>
위 와 같이 LoginIntercepter 가 설정 되 어 있 습 니 다.간단하게 보기 위해 서 이 필 터 는 URL 이'/user/*'인 요청 만 차단 합 니 다.
차단 할 요청 에 대응 하 는 컨트롤 러 는 다음 과 같 습 니 다.

import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.wyb.domain.User;
import com.wyb.service.IUserService;
import com.wyb.service.impl.UserServiceImpl;

@Controller 
@RequestMapping("/user") 
public class UserController { 
 
   private static final Logger LOG=Logger.getLogger(UserController.class);

   @Autowired 
   private IUserService userService; 
  

 @RequestMapping("/showAllUser")
 public String showAllUser(Model m){
  List<User> userlist=new ArrayList<User>(); 
  userlist=userService.findAllUser();
  for(User user :userlist){
   System.out.println(user.getUserName());
  }  
  return "/jsp/showAllUser";
  
 }
}

이 쇼 AllUser()방법 은 모든 사용 자 를 출력 하기 위 한 것 입 니 다.실행 방법 을 표시 하기 위해 모든 사용 자 를 배경 으로 인쇄 합 니 다.URL 은 다음 과 같 습 니 다.http://localhost:8080/TestSSM/user/showAllUser이 URL 은 LoginIntercepter 에 의 해 차단 되 는 것 을 알 수 있 습 니 다.
테스트 페이지 showAllUser.jsp 는 다음 과 같 습 니 다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
 pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>show All User</title>
</head>
<body>
 this is showAllUser Page!!!
</body>
</html>
LoginIntercepter 는 다음 과 같 습 니 다.

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import com.wyb.domain.User;

public class LoginInterceptor implements HandlerInterceptor{

 @Override
 public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
   throws Exception {
  System.out.println("this is afterCompletion of LoginInterceptor");
  
 }

 @Override
 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
   throws Exception {
  System.out.println("this is postHandle of LoginInterceptor");
  
 }

 @Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  // TODO Auto-generated method stub
  System.out.println("this is preHandle of LoginInterceptor");
  HttpSession session=request.getSession();
  User user=(User)session.getAttribute("user");
  if(user==null){
   System.out.println("no user in LoginInterceptor!!!");
   request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);

  } 
  //  true        
  return true;
 }

}

 여기 서 제 가 실 수 를 했 습 니 다.똑똑 한 동료 들 이 알 아 봤 을 수도 있 습 니 다.위의 코드 에 따라 우리 가 방문 하면:http://localhost:8080/TestSSM/user/showAllUser결 과 는 다음 과 같다.

어떻게 보면 차단 에 성공 하여 사용자 이름 정 보 를 입력 하고 홈 페이지 로 정상적으로 이동 하여 다시 들 어 갑 니 다.http://localhost:8080/TestSSM/user/showAllUser다음 과 같다.

페이지 가 정상적으로 출력 되 었 습 니 다.session 이 기록 되 어 있 습 니 다.다시 차단 되 지 않 습 니 다.성공 한 것 같 지만 배경 출력 을 보십시오.

우리 가 쇼 AllUser()방법 을 두 번 실 행 했 는 지 알 수 있 습 니까?첫 번 째 방문 은 차단기 에 의 해 차단 되 어 로그 인 페이지 에 들 어 갔 지만 백 스테이지 에 서 는 쇼 AllUser()가 몰래 실 행 된 것 을 알 수 있 습 니 다.왜 일 까요?우 리 는 나중에 다시 LoginIntercepter.java,특히 preHandle()방법 을 살 펴 보 자.

@Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  // TODO Auto-generated method stub
  System.out.println("this is preHandle of LoginInterceptor");
  HttpSession session=request.getSession();
  User user=(User)session.getAttribute("user");
  if(user==null){
   System.out.println("no user in LoginInterceptor!!!");
   request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);

  } 
  //  true        
  return true;
 }

user 가 비어 있다 고 판단 한 후에 페이지 전환 을 실 행 했 지만 프로그램 은 계속 실 행 될 것 이 고 마지막 에 true 로 돌아 가 는 것 은 차단 되 어 있 는 업무 논리 가 계속 아래로 실 행 될 수 있다 는 것 을 의미 하기 때문에 겉으로 차단 되 었 지만 본질 적 으로 차단 되 지 않 았 다.따라서 다음 과 같이 수정 해 야 한다.

@Override
 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
  // TODO Auto-generated method stub
  System.out.println("this is preHandle of LoginInterceptor");
  HttpSession session=request.getSession();
  User user=(User)session.getAttribute("user");
  if(user==null){
   System.out.println("no user in LoginInterceptor!!!");
   request.getRequestDispatcher("/WEB-INF/jsp/login.jsp").forward(request, response);
   //       ,         
   return false;
  } 
  //  true        
  return true;
 }

user 가 비어 있 습 니 다.이동 한 후에 false 로 돌아 가면 차단 되 는 업무 논 리 를 실행 하지 않 습 니 다.수정 후 배경 출력 은 다음 과 같 습 니 다.

현재 배경 에서 정상적으로 출력 되 고 session 에서 user 정 보 를 저장 한 후에 야 쇼 AllUser()방법 을 실행 할 수 있 습 니 다.큰 성 과 를 거 두 었 습 니 다!
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기