最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringMVC實(shí)現(xiàn)controller中獲取session的實(shí)例代碼

 更新時(shí)間:2017年02月06日 16:51:31   作者:Introspector  
本篇文章主要介紹了SpringMVC實(shí)現(xiàn)controller中獲取session的實(shí)例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。

平時(shí)使用springMVC,在方法中訪問(wèn)session中經(jīng)常很自然地調(diào)用Servlet API。用起來(lái)非常直觀方便,一直沒(méi)有多考慮什么。

比如這樣:

@RequestMapping(value = "/logout")
public String logout(HttpSession session) {
 session.removeAttribute("user");
 return "/login";
} 

但畢竟這樣對(duì)Servlet API產(chǎn)生了依賴,感覺(jué)不夠pojo。

于是我試著解決這個(gè)問(wèn)題。

我打算用一個(gè)注解,名字就叫"sessionScope",Target可以是一個(gè)Method,也可以是Parameter。

也就是說(shuō):

 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();
 }

然后我要注冊(cè)一個(gè)ArgumentResolver,專門解決被注解的東東,把他們統(tǒng)統(tǒng)替換成session里的東西。

代碼如下:

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) {
  //讓方法和參數(shù),兩種target通過(guò)
  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判斷對(duì)象是否被注解,被注解則進(jìn)行resolve。

resolve時(shí)獲取注解值,注解值為session key,用webRequest從session scope中取值。

另外需要將此配置放到org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter的customArgumentResolvers列表中,可以使用bean標(biāo)簽配置,也可以直接使用mvc標(biāo)簽。

即:

namespace為:xmlns: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 />

話說(shuō)mvc:annotation-driven和mvc:default-servlet-handler的順序不能顛倒,該不會(huì)只有我出現(xiàn)這種情況吧- -..

現(xiàn)在可以在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;
}

或者在參數(shù)上注解:

@RequestMapping(value = "/welcome")
public String welcome(@SessionScope("currentUser")User currentUser) {
 return "/main";
}

至于更新session,目前只是用@sessionAttributes配合ModelMap的方式。

或者我可以不用這樣做,直接集成Apache Shiro,在controller中直接getSubject()。

把用戶信息完全讓shiro負(fù)責(zé),嗯,這個(gè)好。

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 輕松掌握J(rèn)ava單例模式

    輕松掌握J(rèn)ava單例模式

    這篇文章主要幫助大家輕松掌握J(rèn)ava單例模式 ,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 淺談一下Java中枚舉的用法

    淺談一下Java中枚舉的用法

    這篇文章主要介紹了淺談一下Java中枚舉的用法,枚舉是一個(gè)被命名的整型常數(shù)的集合,用于聲明一組帶標(biāo)識(shí)符的常數(shù),當(dāng)一個(gè)變量有幾種固定可能的取值時(shí),就可以將它定義為枚舉類型,需要的朋友可以參考下
    2023-04-04
  • Java中避免寫嵌套if樣式的代碼詳解

    Java中避免寫嵌套if樣式的代碼詳解

    這篇文章主要給大家介紹了在Java中如何避免寫嵌套if樣式的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。
    2017-07-07
  • 解決mybatis-plus新增數(shù)據(jù)自增ID變無(wú)序問(wèn)題

    解決mybatis-plus新增數(shù)據(jù)自增ID變無(wú)序問(wèn)題

    這篇文章主要介紹了解決mybatis-plus新增數(shù)據(jù)自增ID變無(wú)序問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2023-07-07
  • Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)簡(jiǎn)單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Java設(shè)計(jì)模式中的組合模式

    Java設(shè)計(jì)模式中的組合模式

    這篇文章主要介紹了Java設(shè)計(jì)模式中的組合模式,組合模式依據(jù)樹形結(jié)構(gòu)來(lái)組合對(duì)象,用來(lái)表示部分以及整體層次,種類型的設(shè)計(jì)模式屬于結(jié)構(gòu)型模式
    2022-07-07
  • 使用jpa的時(shí)候set實(shí)體類屬性自動(dòng)持久化的解決方案

    使用jpa的時(shí)候set實(shí)體類屬性自動(dòng)持久化的解決方案

    這篇文章主要介紹了使用jpa的時(shí)候set實(shí)體類屬性自動(dòng)持久化的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • 在CentOS上配置Java環(huán)境變量的教程

    在CentOS上配置Java環(huán)境變量的教程

    這篇文章主要介紹了在CentOS上配置Java環(huán)境變量的教程,同時(shí)適用于Fedora等其他RedHat系的Linux系統(tǒng),需要的朋友可以參考下
    2015-06-06
  • Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF

    Java基于FFmpeg實(shí)現(xiàn)Mp4視頻轉(zhuǎn)GIF

    FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開(kāi)源計(jì)算機(jī)程序。本文主要介紹了在Java中如何基于FFmpeg進(jìn)行Mp4視頻到Gif動(dòng)圖的轉(zhuǎn)換,感興趣的小伙伴可以了解一下
    2022-11-11
  • Java使用Tesseract-OCR實(shí)戰(zhàn)教程

    Java使用Tesseract-OCR實(shí)戰(zhàn)教程

    本文介紹了如何在Java中使用Tesseract-OCR進(jìn)行文本提取,包括Tesseract-OCR的安裝、中文訓(xùn)練庫(kù)的配置、依賴庫(kù)的引入以及具體的代碼實(shí)現(xiàn),通過(guò)這個(gè)過(guò)程,我們將演示如何從視頻幀中提取文本
    2025-02-02

最新評(píng)論

慈溪市| 齐齐哈尔市| 光泽县| 重庆市| 南皮县| 遂昌县| 沁阳市| 荃湾区| 射阳县| 博兴县| 和田市| 大庆市| 无极县| 秦安县| 丰城市| 朔州市| 丰镇市| 峡江县| 长乐市| 德州市| 汉寿县| 鄂尔多斯市| 旬阳县| 阿图什市| 乐业县| 东辽县| 靖边县| 株洲市| 寿阳县| 古丈县| 芷江| 阿瓦提县| 财经| 临海市| 新乡市| 兰溪市| 汨罗市| 莫力| 江津市| 昌平区| 汪清县|