一.编写WebMvcConfig配置类:

重写addArgumentResolvers方法,将解析类加入

@Configuration
public class WebConfig extends WebMvcConfigurerAdapter { @Autowired
UserArgumentResolver userArgumentResolver;//这个解析类,第二步去编写 @Override //用来解析controller的参数类型的,xxx.class的参数可以被用来判断xxx
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(userArgumentResolver);
super.addArgumentResolvers(argumentResolvers);
}
}

二.编写ArgumentResolver解析类:

@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver { @Autowired
MiaoshaUserService userService;//业务逻辑

  @Overrid //判断是否是支持的参数类型
public boolean supportsParameter(MethodParameter parameter) {
Class<?> clazz = parameter.getParameterType();
return clazz==MiaoshaUser.class; //也就是,如果是MiaoshaUser做参数的话,必须得走下面的解析方法
}

  @Overrid //如果是支持的参数类型,调用此方法解析
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
//从传入的参数获取不了内容,那么可以从request入手
MiaoshaUser user = getUser(request,response);
if(user==null){
render(response,CodeMsg.SESSION_ERROR);
}
return user;//返回给controller
} //向浏览器写出json
private void render(HttpServletResponse response, CodeMsg cm)throws Exception {
response.setContentType("application/json;charset=UTF-8");
OutputStream out = response.getOutputStream();
String str = JSON.toJSONString(Result.error(cm));
out.write(str.getBytes("UTF-8"));
out.flush();
out.close();
} //从请求中获取用户信息 封装重复逻辑(统一session鉴定)
private MiaoshaUser getUser(HttpServletRequest request, HttpServletResponse response) {
//尝试从request里取
String paramToken = request.getParameter(MiaoshaUserService.COOKI_NAME_TOKEN);
//尝试从cookie里取,因为有时cookie禁用了,前端得从request传过来
String cookieToken = getCookieValue(request, MiaoshaUserService.COOKI_NAME_TOKEN);
if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
return userService.getByToken(response, token);
} private String getCookieValue(HttpServletRequest request, String cookiName) {
Cookie[] cookies = request.getCookies();
if(cookies == null || cookies.length <= 0){
return null;
}
for(Cookie cookie : cookies) {
if(cookie.getName().equals(cookiName)) {
return cookie.getValue();
}
}
return null;
}
}

三.修改Controller入口参数类型:

未使用argumentResolver:
@RequestMapping(value="/to_list")
//@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response, Model model) {
        String paramToken = request.getParameter(MiaoshaUserService.COOKI_NAME_TOKEN);
//尝试从cookie里取,因为有时cookie禁用了,前端得从request传过来
String cookieToken = getCookieValue(request, MiaoshaUserService.COOKI_NAME_TOKEN);
if(StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
return null;
}
String token = StringUtils.isEmpty(paramToken)?cookieToken:paramToken;
     //根据token查找从缓存查找user,获取
     MiaoshaUser user = xxxService.getUserByToken(token);
     ......  
修改后:直接传入user:
@RequestMapping(value="/to_list")
//@ResponseBody
public String list(HttpServletRequest request, HttpServletResponse response, Model model, MiaoshaUser user) {
// 一般是token,然后对token从redis取user,user为空抛异常跳转(或者给出异常json),这里通过argumentResolver来封装成user;

Spring配置ArgumentResolver,统一进行session鉴定的更多相关文章

  1. 9.Spring Cloud Config统一管理微服务配置

    Spring Cloud Config统一管理微服务配置 9.1. 为什么要统一管理微服务配置 9.2. Spring Cloud Config简介 Spring Cloud Config为分布式系统 ...

  2. 使用Spring Cloud Config统一管理配置,别再到处放配置文件了

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! 可配置是一个成熟软件系统应该提供的特性,而配置管理对于大型系统就显得十分重要,特别是对于拥有多个应用的微服务系统.可喜的是, ...

  3. Spring配置汇总

    现在主流的JavaWeb应用几乎都会用到Spring,以下是Spring的配置,以及结合Web的SpringMVC配置的汇总. jar包的引入 与Web项目集成 Spring配置文件 SpringMV ...

  4. Springmvc + mybatis + spring 配置,spring事物

    今天配置了半天,发现,事物不起效果,主要出现如下错误: org.mybatis.spring.transaction.SpringManagedTransaction] - [JDBC Connect ...

  5. spring配置详解

    1.前言 公司老项目的后台,均是基于spring框架搭建,其中还用到了log4j.jar等开源架包.在新项目中,则是spring和hibernate框架均有使用,利用了hibernate框架,来实现持 ...

  6. Dubbo中对Spring配置标签扩展

    Spring提供了可扩展Schema的支持,完成一个自定义配置一般需要以下步骤: 设计配置属性和JavaBean 编写XSD文件 编写NamespaceHandler和BeanDefinitionPa ...

  7. Spring Security(15)——权限鉴定结构

    目录 1.1      权限 1.2      调用前的处理 1.2.1     AccessDecisionManager 1.2.2     基于投票的AccessDecisionManager实 ...

  8. Spring Security(13)——session管理

    1.1     检测session超时 1.2     concurrency-control 1.3     session 固定攻击保护 Spring Security通过http元素下的子元素s ...

  9. Spring -- 配置bean的三种方法

    配置通过静态工厂方法创建的bean public class StaticBookFactory { //静态工厂方法: public static Book getBook(String bookN ...

随机推荐

  1. LocalDateTime TypeMismatch

    @DateTimeFormat(pattern = "yyyy-MM-dd")@JsonFormat(pattern = "yyyy-MM-dd", timez ...

  2. c#实现动态加载Dll(转)

    c#实现动态加载Dll 分类: .net2009-12-28 13:54 3652人阅读 评论(1) 收藏 举报 dllc#assemblynullexceptionclass 原理如下: 1.利用反 ...

  3. PERL 正则表达式简介

    来源:脚本之家 网址:http://www.jb51.net/article/17429.htm 一.简介 二.匹配操作符 三.模式中的特殊字符 1.字符+ 2.字符 []和[^] 3.字符 *和? ...

  4. as3.0用了视频组件,导致视频打开后就全屏,加一下代码就行

    myFlv.fullScreenTakeOver = false; fullScreenTakeOver : Boolean 舞台进入全屏模式时,FLVPlayback 组件位于所有内容的顶部并占据整 ...

  5. 侯捷STL课程及源码剖析学习3: 深度探索容器list

    一.容器概览 上图为 GI STL 2.9的各种容器.图中以内缩方式来表达基层与衍生层的关系.所谓的衍生,并非继承(inheritance)关系,而是内含(containment)关系.例如 heap ...

  6. jsp页面之初体验

    最近在学jsp 在web.xml页面中学到了如何让一个页面第一个启动

  7. C# 关于委托

    例如: public class test:Form { //定义委托 public delegate void GetSql(string sql); //定义装载委托的属性 public GetS ...

  8. mysql、oracle 中按照拼音首字母排序

    mysql中按照拼音首字母排序 convert(name using gbk) ASC 注:name 为字段名称 oracle中按照拼音首字母排序 nlssort(enterprise_name,'N ...

  9. QT信号与槽

    参考: 简单例子: http://www.cnblogs.com/MuyouSome/p/3515941.html 基本了解: http://blog.csdn.net/harbinzju/artic ...

  10. 比特币学习-Transaction的locktime属性

    Locktime, also known as nLockTime from the variable name used in the reference client, defines the e ...