no16-第12章第一次课-springmvc处理json数据和拦截器

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: ssm 专栏: ssm框架课 标签: 处理json 拦截器

2023-01-05 18:32:46 635浏览

springMVC处理json,拦截器

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.日期展示问题解决

image.png

  • 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页面静态资源等都可以拦截掉

好博客就要一起分享哦!分享海报

此处可发布评论

评论(1展开评论

蓝色妖姬 能力:10

2023-01-10 10:00:42

老师牛
点击查看更多评论

展开评论

您可能感兴趣的博客

客服QQ 1913284695