-
Notifications
You must be signed in to change notification settings - Fork 0
spring
zhangjie edited this page Oct 12, 2020
·
10 revisions
- java -jar xxx.jar aaa bbb cccc
1.1 通过main方法的参数获取
1.2 或者通过ApplicationArguments注入获取
- java -jar xxx.jar --a1=aaa --b1=bbb
2.1 可以通过@Value("${a1}") 获取
pom文件引入jar包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.2.RELEASE</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
单元测试编写
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath:beans.xml",
"classpath:mybatis.xml"
})
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class ServiceTest {
@Resource
private TrackService trackService;
@Test
public void testFindListByReferenceNo(){
List<TrackEnt> list = service.findListByReferenceNo("KKon0019998");
assertEquals(10,list.size());
}
}
1.1 通过@Before实现测试用例运行前初始化
1.2 通过@After实现测试用例完成后清理
1.3 参考:https://www.jianshu.com/p/83eadf7b352f
- 执行顺序:filter -> Interceptor -> controller
- handleInterceptor拦截比filter更加精准,可以到达方法级别
2.1 preHandle是在进入controller之前执行,postHandle是在返回model渲染视图之前执行,afterCompletion是在request执行完成后执行的
2.2 拦截配置:2.3 被拦截后返回错误码public class MvcConfig implements WebMvcConfigurer{ @Override public void addViewControllers(ViewControllerRegistry registry) { registry.addViewController("/").setViewName("forward:/WEB-INF/views/login.jsp"); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); } @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/webapp/static/**").addResourceLocations("classpath:/webapp/static/"); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userInterceptor).addPathPatterns("/**").excludePathPatterns("/login/sub.do"); } }public class UserInterceptor extends HandlerInterceptorAdapter { public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { PdaResponse pdaResult = new PdaResponse(); pdaResult.setSuccess(false); pdaResult.setCode("-2"); pdaResult.setMessage("pdaNeedReLogin"); response.getOutputStream().write(JsonUtl.Object2Json(pdaResult).getBytes()); response.getOutputStream().close(); return false; } }
- getSession(boolean create):返回当前request中的HttpSession
-->如果当前reqeust中的HttpSession为null
(1)当create为true,就创建一个新的session
(2)当create为false,返回null
- HttpServletRequest.getSession(ture)等同于HttpServletRequest.getSession()
- session原理图
3.1 注册过滤器代理

3.2 Session过滤器执行流程分析

(1)对请求的HttpServletRequest ,HttpServletResponse 对进行包装
(2)调用 filterChain.doFilter(strategyRequest, strategyResponse)往后传递
--> 获得session的话,得到的将会是Spring Session 提供的 HttpServletSession实例
(3)整个过滤器链执行完后,提交session:wrappedRequest.commitSession();
3.3 SessionRepositoryFilter$SessionRepositoryRequestWrapper#getSession方法分析
1. S requestedSession = getRequestedSession(); 1.1 List<String> sessionIds = SessionRepositoryFilter.this.httpSessionIdResolver .resolveSessionIds(this); (1)httpSessionIdResolver分为CookieHttpSessionIdResolver和HeaderHttpSessionIdResolver --> 分别从cookie或者头部获取sessionId 1.2 S session = SessionRepositoryFilter.this.sessionRepository .findById(sessionId); -->通过sessionId在存储里查找session 2. 如果根据sessionId没有找到sesssion并且create参数为true,则新建 --> S session = SessionRepositoryFilter.this.sessionRepository.createSession();
