반응형
우리프로젝트가
학생,교수별 접근제한이 확실히 이루어져야함
버튼만 숨겨놓는다고 해서 접근제한이 완벽하게 되지않음
(주소로 접근이 가능함)
그래서 그 문제를 해결해보고자
세션정보(loginId)에 따른 접근제한을 걸고자한다.
1) webConfig에서 interceptor 지정
2) interceptor생성 (handler)
2-1) StuCheckInterceptor ( 학생인지 확인하는 곳 )
2-2) proCheckInterceptor
3) alertController 생성
4) 테스트
1) webConfig에서 interceptor 지정
package com.ldb.lms.config;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
//학생이 아니라면 false반환(학생만 접근가능)
registry.addInterceptor(new StuCheckInterceptor())
.addPathPatterns("/mypage/getCourseTimetable")
.addPathPatterns("/learning_support/**")
.addPathPatterns("/api/learning_support/**")
.excludePathPatterns("/", "/login", "/css/**", "/js/**");
//교수가 아니라면 false반환(교수만 접근가능)
registry.addInterceptor(new ProCheckInterceptor())
.addPathPatterns("/professors/**")
.addPathPatterns("/notice/createNotice");
}
}
webConfig를 등록해
특정URL(addPathPatterns에 추가한 주소)에 접근하게되면
해당 Interceptor가 실행됨
(true or false에 따라 동작이달라짐)
2) interceptor생성 (handler)
2-1) StuCheckInterceptor ( 학생인지 확인하는 곳 )
package com.ldb.lms.interceptor;
@Component
public class StuCheckInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
/*인자 false의 의미:
false를 전달하면, 기존 세션이 존재하지 않는 경우 새 세션을 생성하지 않고 null을 반환*/
HttpSession session = request.getSession(false);
//세션null검증은 LogincheckInterceptor에서 진행하므로 굳이 로그인세션이 존재하는지 검증하지않는다
String position = (String)session.getAttribute("login");
if(!position.contains("S")) {
String msg = "학생만접근 가능합니다";
//한국어메시지를get방식으로 그냥넘기려하면 문제가생김! URLEncoder를 이용해 UTF-8로 인코딩
response.sendRedirect("/alert?"
+ "url=/"
+ "&"
+ "msg="+URLEncoder.encode(msg, StandardCharsets.UTF_8));
return false;
}
return true; // 학생이라면 정상실행
}
}
2-2) proCheckInterceptor
( 교수인지 확인하는 곳 )
package com.ldb.lms.interceptor;
@Component
public class ProCheckInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) throws Exception {
/*인자 false의 의미:
false를 전달하면, 기존 세션이 존재하지 않는 경우 새 세션을 생성하지 않고 null을 반환*/
HttpSession session = request.getSession(false);
//세션null검증은 LogincheckInterceptor에서 진행하므로 굳이 로그인세션이 존재하는지 검증하지않는다
String position = (String)session.getAttribute("login");
if(!position.contains("P")) {
String msg = "교수만 접근 가능합니다";
//한국어메시지를get방식으로 그냥넘기려하면 문제가생김! URLEncoder를 이용해 UTF-8로 인코딩
response.sendRedirect("/alert?"
+ "url=/"
+ "&"
+ "msg="+URLEncoder.encode(msg, StandardCharsets.UTF_8));
return false;
}
return true; // 교수면 정상실행
}
}
3) alertController 생성
package com.ldb.lms.controller;
@Controller
public class AlertController {
@GetMapping("/alert")
public String callAlert(@RequestParam("url") String url,
@RequestParam("msg") String msg, Model model) {
model.addAttribute("url", url);
model.addAttribute("msg", msg);
return "alert";
}
}
alert페이지를 mapping하는 곳이 없어서 만들었다
/alert 이 매핑되면
파라미터값으로 넘어온 url ,msg값들을
model객체에 담아 alert페이지로 리턴시켜주는역할
4) 테스트
상황 :
학생이 교수지원 카테고리에 접근하려 하는 상황
알림창을 띄운 후 main페이지인 " / " 로 매핑
'프로젝트' 카테고리의 다른 글
프로젝트 마이그레이션 중 ( 구조 중심 설명) (1) | 2025.06.11 |
---|---|
세미프로젝트 (현재:서블릿구조) 마이그레이션 및 고도화 전 (0) | 2025.05.23 |
개인정보(userInfo)퇴학 , 성적확인 , 임시비밀번호알고리즘변경 (3) | 2025.05.19 |
비밀번호암호화 , 비밀번호찾기(임시비밀번호발급 및 메일전송) , 회원가입->인증번호인증->완료 순으로 바꿈 , 회원가입 ,pw찾기 , 개인정보수정 시 유효성검사추가 (1) | 2025.05.16 |
프로젝트중간 (개인정보(userInfo) 내용들 , index매핑과정 controller변경) (0) | 2025.05.14 |