no16-第12章第一次课-springmvc处理json数据和拦截器
分类: ssm 专栏: ssm框架课 标签: 处理json 拦截器
2023-01-05 18:32:46 790浏览
1.springMVC处理json数据
1.1json数据的传递处理
案例:以添加用户的时候异步验证用户编码的唯一性
- 页面部分-ajax请求
- control部分——(前提是要引入fastjson包)
/** * 验证用户编号是否已存在 * @param account * @return */ @ResponseBody // @RequestMapping(value="/userExist", method = RequestMethod.GET) @GetMapping("/userExist") public Object userExist(@RequestParam String account){ logger.debug("验证用户名account="+account + "的用户是否存在"); HashMap<String, Object> resultMap = new HashMap<String, Object>(); if(StringUtils.isNullOrEmpty(account)){ resultMap.put("exist", 1); }else{ SysUser sysUser = sysUserService.getAccountExist(account); if(null != sysUser) { resultMap.put("exist", 1); }else { resultMap.put("exist", 0); } } return JSONArray.toJSONString(resultMap); }
1.2json数据传递过程中的中文乱码和日期问题
案例:查看某个用户的详情的时候,想在当前页面局部刷新展示不跳页面增强用户体验
- 1.ajax返回中文乱码解决:
- 1.1中文乱码解决方法1
在@GetMapping里加produces = {"application/json;charset=UTF-8"}
- 1.2中文乱码解决方法2
springmvc配置文件加消息转换器的配置
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
- 1.3补充jackson的方式
其实直接使用jackson的三个jar包后,放回实体类型的json对象格式就不会出现中文乱码问题,springmvc默认内置的是jackson的消息转换器。
maven方式:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency>
@GetMapping(value = "/view/{id}") @ResponseBody public SysUser view(@PathVariable String id){ logger.debug("根据id查询用户详情"+id); SysUser sysUser = sysUserService.getUserById(id); // model.addAttribute(sysUser); return sysUser; // return "sysUser/view"; }
- 2.日期展示问题解决
- 2.1加注解的方式解决
- 2.2配置fastjson消息转换器
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.StringHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>application/json</value> </list> </property> <property name="features"> <list> <!-- Date的日期转换器 --> <value>WriteDateUseDateFormat</value> </list> </property> <property name="dateFormat" value="yyyy-MM-dd"/> </bean> </mvc:message-converters> </mvc:annotation-driven>
这里注意下,配置了fastjson的话不能写JSON.toJSONString(sysUser),直接return 实体类就行。
/** * 查询用户详情,返回JSON * @param id * @return */ @ResponseBody @GetMapping("/{id}/view") public Object view(@PathVariable String id){ logger.debug("根据id查询用户详情id:" + id); SysUser sysUser = null; try { sysUser = sysUserService.getUserById(id); logger.debug("查询到用户信息:" + sysUser); } catch (Exception e) { e.printStackTrace(); return "failed"; } return sysUser; }
备注:这样配置后发现页面上的时间全部带时分秒,日期也带时分秒了,解决方案可以用加注解和配置结合的方式就OK。
- 2.3补充jackson的方式
注解方式:
@JsonFormat(pattern = "yyyy-MM-dd")
配置消息转换器的方式
<mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg name="pattern" value="yyyy-MM-dd" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven>
2.拦截器
- 自定义拦截器类
public class AuthInterceptor implements HandlerInterceptor{ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { SysUser sysUser=(SysUser) request.getSession().getAttribute(Constants.USER_SESSION); if(sysUser == null){ response.sendRedirect(request.getContextPath()+"/user/toLogin"); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { }
- 将自定义的拦截器配置到框架中,
<mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/user/**"/> <!--设置白名单--> <mvc:exclude-mapping path="/user/toLogin" /> <mvc:exclude-mapping path="/user/login" /> <bean class="cn.cvs.interceptor.AuthInterceptor"/> </mvc:interceptor> </mvc:interceptors>
拦截器的原理:要开车上班忘记车钥匙去内屋拿钥匙的流程
拦截器和过滤器的区别:
- 拦截器只能在springmvc 框架中使用,过滤器可以在任何web项目都可以用
- 拦截器只能拦截control,而过滤器可以拦截jsp页面静态资源等都可以拦截掉
好博客就要一起分享哦!分享海报
您可能感兴趣的博客