> Java > java지도 시간 > 본문

Java의 세션 사용 및 세부 기록을 간략하게 설명합니다.

Y2J
풀어 주다: 2017-05-08 13:33:27
원래의
5725명이 탐색했습니다.

다음 편집자는 SpringMVC의 세션 사용 및 세부 기록에 대해 간략하게 설명합니다. 에디터가 꽤 좋다고 생각해서 지금 공유해서 참고용으로 올려보겠습니다.

서문

최근에 SpringMVC를 처음 사용해서 로그인해야 합니다. 회사 세션을 위해 구축한 시스템에.

인터넷에서 많은 정보를 찾았는데 세션을 저장하는 방법을 대략 2가지로 언급했습니다.

1. javaWeb에서 흔히 사용되는 HttpSession입니다. 프로젝트

2. SpringMVC 전용 @SessionAttributes

저는 개인적으로 @SessionAttributes 사용에 더 신경을 쓰고 있습니다. 그런데 인터넷에 올라온 글을 읽어보니 기본적으로 기본적인 사용법만 설명되어 있고, 기본적으로 자세한 사용법이나 세부사항이 나와 있지 않아서 이것만으로는 부족하다고 생각해서 직접 몇 가지 테스트를 해보고 코드를 컴파일해서 만들어 봤습니다. 데모를 녹음하고 공유하세요. 부족한 점이 있으면 언제든지 토론해 보세요.

자, 헛소리는 이제 그만, 이제 진짜 쇼가 시작됩니다!

결론

글쎄, 코드 읽기를 싫어하는 일부 고객들이 결론을 읽는 수고를 덜기 위해, 먼저 여기에 요약하겠습니다. 먼저 테스트 후 결론을 나열하겠습니다.

1. Controller의 SpringMVC 고유의 ModelMap 및 Model을 통해 세션에 자동으로 데이터를 저장하거나, 기존 HttpSession 및 기타 매개변수를 통해 세션 데이터를 저장할 수 있습니다

2. 세션 데이터를 저장하려면 @SessionAttributes 주석을 사용해야 합니다. 이 주석에는 두 가지 매개변수 선언 메서드(value 및 type)가 있으며 주석 선언은 메서드가 아닌 클래스에 작성되어야 합니다.

3. 저장된 세션 데이터는 @SessionAttributes 주석의 매개변수 목록과 일치해야 합니다. 선언되지 않은 매개변수는 세션에 저장할 수 없습니다.

4. 세션에 저장된 매개변수를 삭제하면 모든 데이터가 삭제되며, 에 지정된 세션 데이터는 개별적으로 삭제할 수 없습니다. 동시에, 삭제 시 유효 권한은 위의 2번과 3번 규칙을 따릅니다. (이 규칙은 지정된 세션 데이터를 삭제하는 효과를 인위적으로 달성하는 데 사용될 수 있습니다.)

5. ModelMap 등을 통해 세션에 데이터를 저장하는 경우, 위의 매개변수 권한 제한도 있습니다

6. ModelMap 또는 Model을 사용하여 세션 데이터를 저장할 때 ModelMap을 메소드로 전달해야 합니다. 매개변수이며 메소드에 새로 정의된 매개변수가 유효하지 않습니다. 동시에 ModelMap이 매개변수로 전달되기만 하면 다른 메소드로 호출되어도 작동합니다

7. @ResponseBody 주석을 사용할 때(보통 ajax와 함께 사용) 세션을 저장할 수 없습니다. 데이터

8. @SessionAttributes 주석은

값 및 유형의 매개변수 목록 2개를 사용할 수 있습니다. 9. HttpSession을 사용하는 전통적인 방법에는 위의 주석과 권한 및 기타 제한 사항이 없으며 아래에 간단한 테스트가 있지만 자세한 설명은 없습니다

몇 가지 상식이 있습니다. 아래 항목

10. 세션 데이터의 작업은 카테고리 간 가능하며 패키지 또는 URL 경로와 관련이 없습니다. 11. 동일한 세션 값으로 작업할 때 나중 값이 이전 값을 덮어씁니다

테스트 코드 및 간단한 지침

개발 도구: Spring Tool Suite .

Spring은 Maven과 Tomcat을 통합한 Eclipse 기반의 IDE 개발 도구를 최근에 추천합니다.

먼저 프로젝트 구조의 스크린샷을 찍어보겠습니다


ajax의 @ResponseBody 주석을 사용하기 때문에 후속 테스트이므로 pom.xml 파일에 jar 패키지를 구성해야 합니다.

<!-- 使用@ResponseBody注解所需的2个包 -->
<dependency>
 <groupId>org.codehaus.jackson</groupId>
 <artifactId>jackson-core-asl</artifactId>
 <version>1.9.13</version>
</dependency>
<dependency>
 <groupId>org.codehaus.jackson</groupId>
 <artifactId>jackson-mapper-asl</artifactId>
 <version>1.9.13</version>
</dependency>
로그인 후 복사

다음은 메인 테스트 코드입니다

package test.dmh.session;

import java.util.Enumeration;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

/**
 * @SessionAttributes 只声明了参数test1
 */
@Controller
@SessionAttributes(value={"test1"})
public class HomeController {
 
 private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
 
 @RequestMapping(value = "/show1")
 public String show(ModelMap modelMap, HttpSession session) {
  logger.info("show session");
  for (Object key : modelMap.keySet()) {
   Object value = modelMap.get(key);
   System.out.println(key + " = " + value);
  }
  System.out.println("***********************************");
  Enumeration<String> e = session.getAttributeNames();
  while (e.hasMoreElements()) {
   String s = e.nextElement();
   System.out.println(s + " == " + session.getAttribute(s));
  }
  System.out.println("***********************************");
  return "home";
 }
 
 @RequestMapping("/set1")
 public String setSession(ModelMap modelMap) {
  logger.info("set session 1");
  modelMap.addAttribute("test1", "value 1"); //设置一个在@SessionAttributes中声明过的参数
  modelMap.addAttribute("test2", "value 2"); //设置一个未在@SessionAttributes中声明过的参数
  return "home";
 }
 
 @RequestMapping("/setM")
 public String setSessionM(Model model) {
  logger.info("set session 1");
  model.addAttribute("test1", "value 1"); //设置一个在@SessionAttributes中声明过的参数
  model.addAttribute("test2", "value 2"); //设置一个未在@SessionAttributes中声明过的参数
  return "home";
 }
 
 @RequestMapping("/clear1")
 public String clear(SessionStatus status) {
  logger.info("clear session 1");
  status.setComplete();
  return "home";
 }
 
}
로그인 후 복사
package test.dmh.session.controller;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * 没有使用@SessionAttributes注解
 */
@Controller
public class IndexController {
 
 private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
 
 @RequestMapping("/set2")
 public String setSession(ModelMap modelMap, HttpSession session) {
  logger.info("set session 2 : without @SessionAttributes");
  modelMap.addAttribute("test3", "value 3");
  session.setAttribute("test4", "value 4");
  return "home";
 }
 
}
로그인 후 복사
package test.dmh.session.controller;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

@Controller
@SessionAttributes(value={"test5", "index"})
public class IndexController2 {
 
 private static final Logger logger = LoggerFactory.getLogger(IndexController2.class);
 
 @RequestMapping("/set3")
 public String setSession(ModelMap modelMap, HttpSession session) {
  logger.info("set session 3");
  modelMap.addAttribute("test5", "value 5");
  session.setAttribute("test6", "value 6");
  
  ModelMap map = new ModelMap();
  map.addAttribute("test7", "value 7");
  
  this.setValueToSession(modelMap, session, "Hello World");
  
  return "home";
 }
 
 @ResponseBody
 @RequestMapping(value="/login")
 public Map<String, Object> login(ModelMap modelMap, HttpSession session) {
  logger.info("login");
  
  Map<String, Object> map = new HashMap<String, Object>();
  
  map.put("success", true);
  map.put("info", "登录成功!");
  
  modelMap.addAttribute("testAjax", "test ajax value");
  session.setAttribute("httpTestAjax", "http test ajax Value");
  
  setValueToSession(modelMap, session, "This is Ajax");
  
  return map;
 }
 
 private void setValueToSession(ModelMap modelMap, HttpSession session, String value) {
  logger.info("set session private");
  modelMap.addAttribute("index", value);
  session.setAttribute("httpIndex", value);
 }
 
 @RequestMapping("/clear2")
 public String clear(SessionStatus status) {
  logger.info("clear session 2");
  status.setComplete();
  return "home";
 }
 
 @RequestMapping(value = "/show2")
 public String show(ModelMap modelMap, HttpSession session) {
  logger.info("show session");
  for (Object key : modelMap.keySet()) {
   Object value = modelMap.get(key);
   System.out.println(key + " = " + value);
  }
  System.out.println("***********************************");
  Enumeration<String> e = session.getAttributeNames();
  while (e.hasMoreElements()) {
   String s = e.nextElement();
   System.out.println(s + " == " + session.getAttribute(s));
  }
  System.out.println("***********************************");
  return "home";
 }
 
}
로그인 후 복사
Java의 세션 사용 및 세부 기록을 간략하게 설명합니다.저처럼 STS로 빌드한 프로젝트라면 기본 jsp 파일의 구성은 <%@ page session="false" 입니다. %> ;, 삭제하거나

댓글 달기

해야 합니다. 그렇지 않으면 세션에 있는 데이터를 페이지에 표시할 수 없습니다. 물론 여기서 작성한 /show 테스트를 통해 배경 코드를 직접 보는 것도 가능합니다.

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
4 <html>
<head>
 <title>Home</title>
</head>
<body>
<h1>
 Hello world! 
</h1>

<p> The test1 is ${sessionScope.test1}. </p>
<p> The test2 is ${sessionScope.test2}. </p>
<p> The test3 is ${sessionScope.test3}. </p>
<p> The test4 is ${sessionScope.test4}. </p>
<p> The test5 is ${sessionScope.test5}. </p>
<p> The test6 is ${sessionScope.test6}. </p>
<p> The test7 is ${sessionScope.test7}. </p>
<p> The index is ${sessionScope.index}. </p>
<p> The httpIndex is ${sessionScope.httpIndex}. </p>

<br>
<input type="button" value="test" onclick="test();">

<script src="resources/js/jquery.min.js"></script>
<script type="text/javascript">
function test() {
 $.ajax({
  type : "POST",
  url : "login",
  dataType : "json",
  success : function(data) {
   console.log(data);
   window.open("/session/test", "_self");
  },
  error : function() {
   alert("出错了!");
  }
 });
}
</script>
</body>
</html>
로그인 후 복사

@SessionAttributes 매개변수 구성을 위한 테스트 코드도 있습니다

package test.dmh.session.controller;

import java.util.Enumeration;

import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.SessionAttributes;
import org.springframework.web.bind.support.SessionStatus;

@Controller
@SessionAttributes(value={"index1", "index2"}, types={String.class, Integer.class})
public class IndexController3 {
 
 private static final Logger logger = LoggerFactory.getLogger(IndexController3.class);
 
 @RequestMapping("/setIndex")
 public String setSession(ModelMap modelMap) {
  logger.info("set session index");
  modelMap.addAttribute("index1", "aaa");
  modelMap.addAttribute("index2", "bbb");
  modelMap.addAttribute("index2", "ccc");
  modelMap.addAttribute("DDD");
  modelMap.addAttribute("FFF");
  modelMap.addAttribute(22);
  
  return "home";
 }
 
 @RequestMapping(value = "/showIndex")
 public String show(ModelMap modelMap, HttpSession session) {
  logger.info("show session");
  for (Object key : modelMap.keySet()) {
   Object value = modelMap.get(key);
   System.out.println(key + " = " + value);
  }
  System.out.println("***********************************");
  Enumeration<String> e = session.getAttributeNames();
  while (e.hasMoreElements()) {
   String s = e.nextElement();
   System.out.println(s + " == " + session.getAttribute(s));
  }
  System.out.println("***********************************");
  return "home";
 }
 
 @RequestMapping("/clearIndex")
 public String clear(SessionStatus status) {
  logger.info("clear session index");
  status.setComplete();
  return "home";
 }
 
}
로그인 후 복사

테스트 프로세스에 대한 간략한 설명:

매개변수가 많아서 이름을 생각하기가 너무 귀찮아서 직렬화된 테스트 1, 2, 3을 통과했습니다.

set1과 set2를 입력할 때마다 show1과 show2를 입력해야 콘솔을 통해 세션의 콘텐츠를 볼 수 있음은 물론, 디스플레이 정보를 브라우저에서 직접 볼 수도 있습니다.

여기서 주요 결론에 대해 이야기하겠습니다.

1. ModelMap을 사용하여 세션에 데이터를 자동으로 저장하려면 @SessionAttributes 주석을 구성해야 합니다.

2. @SessionAttributes 주석은 클래스에서만 선언할 수 있습니다. 선언 후에는 클래스의 메서드는 @SessionAttributes에 구성된 매개 변수에서만 작동할 수 있습니다. 저장하고 지우고 읽습니다.

마지막으로 @SessionAttributes의 매개변수 구성에 대해 몇 가지 결론을 내릴 수 있습니다.

1. 구성 매개변수는 Array 유형. (파라미터가 하나만 있는 경우에는 @SessionAttributes(value="test1", type=Integer.class) 와 같이 배열 형식으로 작성할 필요가 없습니다.)

2. 값을 사용하여 매개 변수를 구성합니다. Map key

의 키-값 쌍과 유사합니다. 3. 실제 유형의 매개변수를 구성한 후 백그라운드에 저장된 키는 해당 유형을 저장할 때만 유용하다고 생각합니다. type=User.class 와 같은 custom class

object, String과 같은 일반적인 공통 클래스 객체의 경우 값 키-값 쌍을 사용하는 것이 더 낫다고 생각합니다. 물론, 구체적인 상황은 여전히 ​​사례별로 분석되어야 합니다.

[관련 추천]

1.

Java 무료 동영상 튜토리얼

2.

이미지의 동일 비율 썸네일 구현에 대한 Java 동영상 튜토리얼

3.

FastJson 튜토리얼 매뉴얼

위 내용은 Java의 세션 사용 및 세부 기록을 간략하게 설명합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!