最近在自己在做一个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)类型中包含该指定类型才返回;
去掉该语句,重新运行,问题解决!