关于springmvc返回到前台报406错误与404错误的解决

时间:2022-01-25 20:08:34

最近在自己在做一个web项目练手,采用springmvc进行前后台的连接跳转。做到登录模块时,由Controller返回给前端的值报404错误,修改后又报406错误,接下来把解决错误的方法贴出来分享。

以下是Controller中的代码(接受前台提交的user对象,返回loginUser对象)

@RequestMapping(value="/login",produces="text/html;charset=UTF-8",method=RequestMethod.POST)
	public LoginUser login(@RequestBody User user, HttpServletRequest request){
		User u = userService.getUserByPhone(user.getPhone());
		System.out.println(u.getUsername());
		if(null!=u){
			if(user.getPassword().equals(u.getPassword())){
				HttpSession session = request.getSession();
				LoginUser loginUser = new LoginUser();
				loginUser.setUserId(u.getUserid());
				loginUser.setPhone(u.getPhone());
				loginUser.setUserName(u.getUsername());
				loginUser.setRole(u.getRole());
				String token = SessionUtils.getToken(request);
				loginUser.setToken(token);
				
				System.out.println(loginUser.getPhone());;
				session.setAttribute(SessionUtils.SIGN_IN_USER, u);
				session.setMaxInactiveInterval(10*60);
				
				return loginUser;
			}else{
				throw new OrtException(400,"账号密码不匹配");
			}
		}else{
			throw new OrtException(400,"没有此账号");
		}
	}
 返回之后报404错误:

HTTP Status 404 - /ssm-ng/WEB-INF/jsp/user/login.jsp

后调试controller方法断点正常,返回值正常,问题出在返回的路径中,返回路径并不是默认转发,而是按照了springmvc配置文件中配置的路径返回。

spring-mvc.xml:

<!-- 定义跳转的文件的前后缀 ,视图模式配置 -->
<bean  class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 这里的配置我的理解是自动给后面action的方法return的字符串加上前缀和后缀,变成一个 可用的url地址 -->
	<property name="prefix" value="/WEB-INF/jsp/" />
	<property name="suffix" value=".jsp" />
</bean>

后来在login方法上添加了@responseBody,继续返回,发现路径正确,但是报406错误

HTTP Status 406 -

type Status report

message

description The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers.

后来在网上查询解决方法,大部分说缺少JSON包和配置文件中没有配置<mvc:annotation-driven /> ,测试了半天发现都不对,最终参照之前写过的方法发现问题出现在
produces="text/html;charset=UTF-8"
该语句是为了解决返回JSON乱码问题的,查了查资料得知

produces: 指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回;

去掉该语句,重新运行,问题解决!