SpringMVC - controller中获取session

平时使用springMVC

在方法中访问session中经常很自然地调用Servlet API。

用起来非常直观方便,一直没有多考虑什么。

比如这样:

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

但毕竟这样对Servlet API产生了依赖,感觉不够pojo。

于是我试着解决这个问题。

我打算用一个注解,名字就叫"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();
}

然后我要注册一个ArgumentResolver,专门解决被注解的东东,把他们统统替换成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) {
        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,用webRequest从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";
}

至于更新session,目前只是用@sessionAttributes配合ModelMap的方式。
嗯,我不是很喜欢这种方式...

或者我可以不用这样做,直接集成Apache Shiro,在controller中直接getSubject()。
把用户信息完全让shiro负责,嗯,这个好。

SpringMVC - controller中获取session,布布扣,bubuko.com

时间: 2024-10-28 23:22:46

SpringMVC - controller中获取session的相关文章

spring mvc controller中获取request head内容

spring mvc controller中获取request head内容: @RequestMapping("/{mlid}/{ptn}/{name}") public String print(@PathVariable Integer mlid, @PathVariable String ptn, @PathVariable String name, HttpSession session, Model model, @RequestHeader String referer,

在IHttpHandler中获取session

因为业务要异步通过IHttpHandler获得数据,但还要根据当前登录人员的session过滤,因此要在在IHttpHandler中获取session 方法是HttpHandler容器中如果需要访问Session,必须实现IRequiresSessionState接口,这只是一个标记接口,没有任何方法. 声明时加上 public class MyHandler : IHttpHandler,IRequiresSessionState 具体httphandler介绍可见 一点一点学ASP.NET之

jsp页面中获取session中的值

JSTL标签获取Session: session.setAttribute("age","123"); ${ sessionScope.age} 在页面上显示的就是123了 sessionScope指的是session的范围,类似还有requestScope,pageScope,contextScope 然后后面的age表示的是set属性时的key值 Jsp中获取Session: session是jsp的内置对象,所以你可以直接写在jsp的 <% sessio

spring在普通类中获取session和request

在使用spring时,经常需要在普通类中获取session,request等对像.比如一些AOP拦截器类,在有使用struts2时,因为struts2有一个接口使用org.apache.struts2.ServletActionContext即可很方便的取到session对像.用法:ServletActionContext.getRequest().getSession(); 但在单独使用spring时如何在普通类中获取session,reuqest呢?首先要在web.xml增加如下代码: <l

js中获取session

方式一 如下所示,但下列代码不能保存在单独的js文件中,也不能嵌入到html文件中,只能嵌入到动态页面里,比如jsp文件等. <script type="text/javascript"> var userid = '<%=session.getAttribute("userid")%>'; if(userid == "null"){//注意此处为"null"非null alert("Plea

在SpringMVC Controller中注入Request成员域

主题 在工作中遇到1个问题....我们定义了一个Controller基类,所有Springmvc自定义的controller都继承它....在它内部定义一个@Autowired HttpServletRequest request;可不可以? 能不能从这个对象里取requestParamters和attributes? 多线程之间会不会影响? 思考 初次思考,我想这应该是不行的.为什么呢? 注入bean是在spring容器启动的时候...request的实现类是在tomcat里(我使用的serv

在spring MVC的controller中获取ServletConfig

在使用SmartUpload进行文件上传时,需要用到srevletConfig: 如果是在servlet中写当然是很容易实现的: private ServletConfig config; //初始化Servlet final public void init(ServletConfig config) throws ServletException{ this.config=config; } init方法会在servlet初始化时获取到servletConfig. 但是在Controller

一般处理程序中,获取session

注意了: 1.要在一般处理程序中获取其他页面的session值,需要引用名空间: using System.Web.SessionState; 2.然后继承一个接口:IRequiresSessionState,如图: 3.然后就可以获得session值了 string s =context.Session["Verifycode"].ToString();

在springMVC的controller中获取request,response对象的一个方法

使用springMVC的时候,有些时候会需要获取请求或者响应对象,例如在身份验证的时候,需要获取请求头中的token,在做登录系统的时候需要使用response对象向客户端添加cookie,一个有效的做法是在controller的方法中添加对应参数如下所示: @RestController public class Test2Contrller { @RequestMapping("/test") public void test(HttpServletRequest req, Htt