使用springmvc controller框架时,怎样在controller里获得Session

下次自动登录
现在的位置:
& 综合 & 正文
在springMVC中的controller写单元测试
给controller写单元测试的方法有主要有两种
依赖service以及dao层,通过内存数据库H2或者dbUnit做假数据库,insert假数据到内存中
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = "classpath:applicationContext-test.xml")
public abstract class ControllerTestCase extends TestCase {
protected MockMvc mockM
public void setUp() throws Exception {
mockMvc = MockMvcBuilders.standaloneSetup(getController()).build();
public void testSave() throws Exception {
ResultActions resultActions = this.mockMvc.perform(MockMvcRequestBuilders.put("/test/save.do")
.accept(MediaType.APPLICATION_JSON).param("id", "1000").param("name", "test"));
MvcResult mvcResult = resultActions.andReturn();
ModelAndView modelAndView = mvcResult.getModelAndView();
System.out.println(modelAndView.getViewName());
assertEquals("redirect:null", modelAndView.getViewName());
这种方法是基于mock,用mockito创建mock对象,解决controller对其他类的依赖问题,我倾向于用这种方法,因为这种方法,脱离了类之间的依赖关系,实现了真正意义上的组件的单元测试。同时我也避免了写数据库sql到内存等一些了啰嗦的问题。
demo如下:
public class CreativeTemplateControllerTest extends TestCase{
private CreativeTemplateController creativeTemplateC
private CreativeTemplateService mockCreativeTemplateS
public void setUp() throws Exception {
creativeTemplateController = new CreativeTemplateController();
mockCreativeTemplateService= mock(CreativeTemplateService.class);
creativeTemplateController.setCreativeTemplateService(mockCreativeTemplateService);
public void testSave() {
MockHttpServletRequest request = new MockHttpServletRequest("POST", "/save.do");
request.addParameter("url", "index?pageNo=20");
request.setSession(new MockHttpSession(null));
HttpServletResponse response = new MockHttpServletResponse();
CrtTemplate crtTemplate = new CrtTemplate();
crtTemplate.setId(1L);
crtTemplate.setName("test");
String result = creativeTemplateController.save(request, response, crtTemplate);
assertEquals("redirect:index?pageNo=20", result);
verify(mockCreativeTemplateService).saveCrtTemplate(crtTemplate);
} catch (UnsupportedEncodingException e) {
这种方法还可能会用到spring的一些mock类:
MockHttpServletRequest—几乎每个单元测试中都要使用这个类,它是J2EE Web应用最常用的接口HttpServletRequest的mock实现。
MockHttpServletResponse—此对象用于HttpServletResponse接口的mock实现。
MockHttpSession—这是另外一个经常使用的mock对象(后文将讨论此类在会话绑定处理中的应用)。
DelegatingServletInputStream—这个对象用于ServletInputStream接口的mock实现。
DelegatingServletOutputStream—这个对象将代理ServletOutputStream实现。在需要拦截和分析写向一个输出流的内容时,你可以使用它。
总之,在实现你自己的测试控制器时,上面这些对象是最为有用的。然而,Spring也提供了下列相应于其它不太常用的组件的mock实现(如果你是一个底层API开发者,那么你可能会找到其各自的相应用法):
MockExpressionEvaluator—这个mock对象主要应用于你想开发并测试你自己的基于JSTL的标签库时。
MockFilterConfig—这是FilterConfig接口的一个mock实现。
MockPageContext—这是JSP PageContext接口的一个mock实现。你会发现这个对象的使用有利于测试预编译的JSP。
MockRequestDispatcher—RequestDispatcher接口的一个mock实现,你主要在其它mock对象内使用它。
MockServletConfig—这是ServletConfig接口的一个mock实现。在单元测试某种Web组件(例如Struts框架所提供的Web组件)时,要求你设置由MockServletContext所实现的 ServletConfig和ServletContext接口。
那么,我们该如何使用这些mock对象呢?我们知道,HttpServletRequest 是一个持有描述HTTP参数的固定值的组件,而正是这些参数驱动Web组件的功能。MockHttpServletRequest,作为 HttpServletRequest接口的一个实现,允许你设置这些不可改变的参数。在典型的Web组件测试情形下,你可以实例化这个对象并按如下方式设置其中的任何参数:
//指定表单方法和表单行为
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/main.app");
request.addParameter("choice", expanded);request.addParameter("contextMenu", "left");
同样地,你可以实例化并全面地控制和分析HttpResponse和HttpSession对象。接下来,让我们简要观察Spring所提供的特定的JUnit框架扩展。
&&&&推荐文章:
【上篇】【下篇】[Spring MVC]教程――使用拦截器实现权限控制
之前一直都在用mvc的拦截器权限控制,后来上网也研究了一些这方面的知识,下面就直接分享下我对mvc的拦截器的理解,通过项目来分析吧。。。
1、首先准备对应的架包
2、看看项目的架构
3、基本的web.xml文件
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:mvc.xml
3、配置classpath下的mvc.xml文件
/WEB-INF/pages/
4、接着就要配置拦截器了MemberInterceptor.java
package com.cat.
import java.net.URLE
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
import mons.lang.StringU
import org.springframework.web.servlet.HandlerI
import org.springframework.web.servlet.ModelAndV
* @author chenlf
public class MemberInterceptor implements HandlerInterceptor {
public final static String SEESION_MEMBER = &seesion_member&;
* (non-Javadoc)
* @see org.springframework.web.servlet.HandlerInterceptor#afterCompletion(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object, java.lang.Exception)
public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
Exception arg3) throws Exception {
// TODO Auto-generated method stub
* (non-Javadoc)
* @see org.springframework.web.servlet.HandlerInterceptor#postHandle(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object, org.springframework.web.servlet.ModelAndView)
public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
ModelAndView arg3) throws Exception {
// TODO Auto-generated method stub
* (non-Javadoc)
* 拦截mvc.xml配置的/member/**路径的请求
* @see org.springframework.web.servlet.HandlerInterceptor#preHandle(javax.servlet.http.HttpServletRequest,
* javax.servlet.http.HttpServletResponse, java.lang.Object)
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
Object handler) throws Exception {
//请求的路径
String contextPath=request.getContextPath();
String url=request.getServletPath().toString();
HttpSession session = request.getSession();
String user = (String) session.getAttribute(SEESION_MEMBER);
//这里可以根据session的用户来判断角色的权限,根据权限来重定向不同的页面,简单起见,这里只是做了一个重定向
if (StringUtils.isEmpty(user)) {
//被拦截,重定向到login界面
response.sendRedirect(contextPath+&/login.htm?redirectURL=&
+ URLEncoder.encode(url));
这样拦截器的核心就配置完了,接下来就是一些登陆的处理操作
5、LoginController.java文件
package com.cat.spring.
import java.net.URLD
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpS
import mons.lang.StringU
import org.springframework.stereotype.C
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.bind.annotation.RequestM
import org.springframework.web.servlet.ModelAndV
import com.cat.interceptor.MemberI
* @author chenlf
@Controller
public class LoginController {
@RequestMapping(value = &/login&, method = RequestMethod.GET)
public ModelAndView login(String redirectURL, HttpServletRequest request) {
ModelAndView view = new ModelAndView();
//把拦截前路径存下来,以便登入成功可以直接请求到登录前的页面
view.addObject(&redirectURL&, redirectURL);
view.setViewName(&/login&);
@RequestMapping(value = &/submit&, method = RequestMethod.POST)
public String submit(String username, String password, String redirectURL,
HttpServletRequest request) {
//模拟登陆成功 用户admin 密码admin的用户
if (StringUtils.isNotBlank(username) && StringUtils.isNotBlank(password)
&& username.equals(&admin&) && password.equals(&admin&)) {
//当登陆成功是,将用户信息存放到session中去
HttpSession session = request.getSession();
session.setAttribute(MemberInterceptor.SEESION_MEMBER, &admin&);
if (StringUtils.isNotBlank(redirectURL)) {
return &redirect:& + URLDecoder.decode(redirectURL);
return &redirect:/member/index.htm&;
if (StringUtils.isNotBlank(redirectURL)) {
return &redirect:/login.htm?& + URLDecoder.decode(redirectURL);
return &redirect:/login.htm&;
6、下面就是login.jsp文件
&%@ page language=&java& contentType=&text/ charset=UTF-8&
pageEncoding=&utf-8&%&
mvc权限登陆login
7、剩下的就是一些正常的mvc请求处理的文件,这里就不赘诉了
8、到这里看看效果吧
a、当非登陆状态的时候,请求localhost:8010/demo-mvc/member/list.htm时,被拦截拦截,重定向到login页面,并携带了当前的这个路径(/member/list.htm)作为参数传到页面
b、输入正确的用户名admin 密码admin后登陆,会跳转到拦截前的页面
c、当登陆完成后,输入地址为http://localhost:8010/demo-mvc/member/index.htm,session中记录着当前用户的信息,不需要重新登陆了
9、因为篇幅问题,一些不重要的文件没有一一贴出来,有需要的可以到http://download.csdn.net/detail/a98925源代码。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'最全的SpringMVC中的Controller_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
最全的SpringMVC中的Controller
上传于||文档简介
&&最​全​的​S​p​r​i​n​g​M​V​C​中​的​C​o​n​t​r​o​l​l​e​r
大小:12.84KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢使用springMVC框架时,怎样在controller里获得Session_百度知道
使用springMVC框架时,怎样在controller里获得Session
提问者采纳
public String
aaGet(HttpSession session) {
session.getAttribute(&&);
return &quo憨耽封甘莩仿凤湿脯溅t;&;
其他类似问题
为您推荐:
session的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 springmvc controller 的文章

 

随机推荐