SpringMVC 구현 controller에서 세션을 가져오는 실례 코드
5461 단어 controllerspringmvcsession
예:
@RequestMapping(value = "/logout")
public String logout(HttpSession session) {
session.removeAttribute("user");
return "/login";
}
그러나 이렇게 해서 Servlet API에 의존하게 되었기 때문에 포조가 부족하다고 느낀다.그래서 나는 이 문제를 해결하려고 시도했다.
저는 주석을 하나 쓸 생각입니다. 이름은'sessionScope'입니다. Target은 하나의 Method일 수도 있고 Parameter일 수도 있습니다.
즉,
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ ElementType.PARAMETER,ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface SessionScope {
String value();
}
그리고 저는 Argument Resolver를 등록해서 주해된 동동을 전문적으로 해결하고 그들을 모두 세션의 물건으로 바꾸겠습니다.코드는 다음과 같습니다.
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
public class SessionScopeMethodArgumentResolver implements
HandlerMethodArgumentResolver {
@Override
public boolean supportsParameter(MethodParameter parameter) {
// , target
if(parameter.hasParameterAnnotation(SessionScope.class))return true;
else if (parameter.getMethodAnnotation(SessionScope.class) != null)return true;
return false;
}
@Override
public Object resolveArgument(MethodParameter parameter,
ModelAndViewContainer mavContainer, NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
String annoVal = null;
if(parameter.getParameterAnnotation(SessionScope.class)!=null){
logger.debug("param anno val::::"+parameter.getParameterAnnotation(SessionScope.class).value());
annoVal = parameter.getParameterAnnotation(SessionScope.class).value();
}else if(parameter.getMethodAnnotation(SessionScope.class)!=null){
logger.debug("method anno val::::"+parameter.getMethodAnnotation(SessionScope.class).value());
annoVal = parameter.getMethodAnnotation(SessionScope.class)!=null?
StringUtils.defaultString(parameter.getMethodAnnotation(SessionScope.class).value())
:StringUtils.EMPTY;
}
if (webRequest.getAttribute(annoVal,RequestAttributes.SCOPE_SESSION) != null){
return webRequest.getAttribute(annoVal,RequestAttributes.SCOPE_SESSION);
}
else
return null;
}
final Logger logger = LoggerFactory.getLogger(SessionScopeMethodArgumentResolver.class);
}
supportParameter는 대상이 주해되었는지 판단하고, 주해되었는지는resolve를 진행합니다.resolve에서 주석 값을 가져옵니다. 주석 값은 session key이고 웹 Request로 session scope에서 값을 가져옵니다.
또한 이 설정을 org에 두어야 합니다.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter의customArgumentResolvers 목록에서 bean 탭 설정을 사용할 수도 있고 mvc 탭을 직접 사용할 수도 있습니다.
즉,
namespace: xmlns: mvc = "http://www.springframework.org/schema/mvc"
schema location은:http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
<mvc:annotation-driven>
<mvc:argument-resolvers>
<bean class="pac.common.SessionScopeMethodArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
<mvc:default-servlet-handler />
그런데 mvc:annotation-driven과 mvc:default-servlet-handler의 순서가 뒤바뀌면 안 돼요. 저만 이런 상황이 생기는 건 아니겠죠--...이제 controller에서 사용할 수 있습니다. 예를 들면:
@RequestMapping(value = "/index")
@SessionScope("currentUser")
public ModelAndView index(User currentUser) {
ModelAndView mav;
if (currentUser==null || currentUser.getId()==null)
mav = new ModelAndView("/login");
else {
mav = new ModelAndView("/index");
}
return mav;
}
또는 매개변수에 메모:
@RequestMapping(value = "/welcome")
public String welcome(@SessionScope("currentUser")User currentUser) {
return "/main";
}
세션 업데이트는 현재 @sessionAttributes로 모델맵에 맞추는 방식입니다.아니면 이렇게 하지 않고 Apache Shiro를 통합해서 controller에서 getSubject()를 직접 사용할 수 있습니다.
사용자 정보를 완전히shiro에게 맡기세요. 응, 이게 좋아요.
이상은 본문의 전체 내용입니다. 여러분의 학습에 도움이 되고 저희를 많이 응원해 주십시오.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Processing controlP5로 GUI 컨트롤러Processing에서 ControlP5 라이브러리를 사용하면 쉽게 GUI 컨트롤러를 만들 수 있습니다. 이번 자주 사용하는 슬라이더와 버튼에 대해 적어 둡니다. 향후 늘릴지도, 늘지 않을지도,라고 하는 곳. Pro...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.